我想实现通过expressiong表达式调用方法。 我已经想到的方式是直接通过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();

https://www.codesd.com/item/how-to-call-the-method-from-a-methodcallexpression-method-in-c.html