从Expression树中获取MethodInfo

时间:2015-01-18 19:12:24

标签: c# lambda expression-trees

我有以下方法:

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)方法被调用?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

您可以尝试使用ExpressionVisitor。覆盖VisitMethodCall方法将允许您检查表达式中的每个方法调用。如果是customer => customer.Get(1),您将获得MethodCallExpression一次回调,Object属性设置为ParameterExpression,代表customerMethod参数设置为{ {1}}方法的{1}}和MethodInfo设置为表示整数常量Get的单个常量表达式的集合。