gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:37:59 27 4
gpt4 key购买 nike

我有一个方法调用表达式并尝试调用该方法。我想出了一个办法,但我在检索参数值时遇到了问题,因为并非每个参数都用 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();

关于c# - 如何从 C# 中的 MethodCallExpression 调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/776442/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com