gpt4 book ai didi

c# - 我可以动态创建一个表示 lambda 的表达式,该表达式在输入参数上调用一个方法吗?

转载 作者:行者123 更新时间:2023-12-03 19:15:55 24 4
gpt4 key购买 nike

假设我有一个 A 类的对象。
假设我需要一个在类 A 上调用方法 M 的表达式。
这甚至可行吗?

基本上,我需要以编程方式获得这个 lambda
a => a.M();

诀窍是,我想通用地执行此操作,即我计划使用反射来确定该方法被称为 M 以及它想要什么参数。

我尝试使用 Expression.Lambda(MethodCallExpression method, ParameterExpression params)。

问题在于,当我定义方法调用表达式时,我必须指定一个实例(如果它是静态方法,则将其保留为 null,而事实并非如此)。我不要这个。我希望传入 lambda 的任何参数(在我的示例中为 a)作为实例。

这可能吗?

最佳答案

是的,可以构建一个 linq expression在运行时。

例如。下面是构造返回 object 的方法调用表达式的示例。 .这确实是一个虚拟示例,因为最好避免使用 object赞成严格类型。

static Expression<Func<T, object>> ComposeMethodCallExpressionAsFuncObject<T>(string methodName)
{
MethodInfo mi = typeof(T).GetMethod(methodName, types: new Type[0])
?? throw new ArgumentException($"There is no '{methodName}' method in the '{typeof(T).Name}' with the empty arguments list!");

var paramExpression = Expression.Parameter(typeof(T));
var methodCallExpression = Expression.Call(paramExpression, mi);

var result = Expression.Lambda<Func<T, object>>(methodCallExpression, paramExpression);
return result; // (T obj) =>obj.methodName()
}

,以及用法示例:
int foo = 9988;
var expression = ComposeMethodCallExpressionAsFuncObject<int>(nameof(int.ToString));
//expression: (int obj) => obj.ToString()
var result = expression.Compile()(foo);
Assert.AreEqual("9988", result);

关于c# - 我可以动态创建一个表示 lambda 的表达式,该表达式在输入参数上调用一个方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60622510/

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