我想实现通过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