如何从C#中的MethodCallExpression调用方法

我有一个方法调用表达式,并尝试调用该方法。我想出了一种方法,但是在检索参数值时有问题,因为不是每个参数都用ConstantExpression描述。 

 

Expression<Action<T>> = t => t.DoSomething(Par0, Par1, Par2);
MethodCallExpression methodCallExpression = selector.Body 
                                               as MethodCallExpression;

// get the information which is needed to invoke the method from the provided 
// lambda expression.
MethodInfo methodInfo = methodCallExpression.Method;
object[] arguments = methodCallExpression.Arguments.OfType<ConstantExpression>()
                            .Select(p => p.Value).ToArray();

// invoke the expression on every item within the enumerable
foreach (TSource item in source)
{ 
    methodInfo.Invoke(item, arguments);
}

另外,我已经看到了一些其他的方法来调用该方法,现在我不知道该怎么做正确的方法。

 

var func = expression.Compile();
var success = func.Invoke();

所以我的问题是,如何从methodCallExpression.Arguments检索方法参数值?

还是有更简单的方法来实现我的目标?

您不需要担心自己检索参数并调用MethodInfo,您可以让.NET为您做。所有您需要做的是创建一个包含该方法的Lambda表达式。 

例如。

 

MethodCallExpression expression = GetExpressionSomeHow();
object result = Expression.Lambda(expression).Compile().DynamicInvoke();

这就是我在Linq提供者中处理嵌套查询的方式。

编辑:实际上,你可能已经在选择器变量中有一个LambdaExpression。在这种情况下,您应该可以直接编译和调用它:

 

object result = selector.Compile().DynamicInvoke();
赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏