【问题标题】:Get MethodInfo from Expression tree从表达式树中获取 MethodInfo
【发布时间】:2015-01-18 19:12:23
【问题描述】:

我有以下方法:

public TResult Call<TResult>(Expression<Func<T, TResult>> code)
{
    var returnValue = default(TResult);
    // code that will inspect the interface method that is being called 
    // along with lots of other code
    // and then call a WebAPI service.
    return returnValue;
}

在这种情况下,T 是一个名为 ICustomer 的接口,TResult 将是一个类 CustomerData 在这种特定情况下,我正在执行以下操作:

var model = client.Call(customer => customer.Get(1));

我的最终目标是能够检查某些属性的接口方法。基于这些属性,我想调用一个 WebAPI 服务并将接口方法中的任何参数传递给它。

如何在Call 方法中确定调用了interface.Get(1) 方法?

【问题讨论】:

  • 你应该对 T 和 TResult 设置一些类型约束,如果它们总是那些类型的话。
  • @GeorgeMauer 他们并不总是这些类型。我继续更新帖子。谢谢。

标签: c# lambda expression-trees


【解决方案1】:

鬼混之后,我需要做的就是将表达式的Body 转换为MethodCallExpression

【讨论】:

    【解决方案2】:

    您可以尝试为此使用ExpressionVisitor。覆盖VisitMethodCall 方法将让您检查表达式中的每个方法调用。在customer =&gt; customer.Get(1) 的情况下,您将获得一个带有MethodCallExpression 的回调,其中Object 属性设置为ParameterExpression,代表customerMethod 参数设置为MethodInfo Get 方法的MethodInfo,以及@987654334 @ 设置为表示整数常量1 的单个常量表达式的集合。

    【讨论】:

    • 我无法覆盖VisitMethodCall。它受到保护。您可以覆盖的唯一瘦身是Visit
    • 您可以覆盖继承类中的受保护方法。 .Net 允许做这样的事情
    • @JustinAdkins 这应该不是问题 - 以 this Q&A 为例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多