gpt4 book ai didi

c# - 表达式树和调用委托(delegate)

转载 作者:IT王子 更新时间:2023-10-29 04:48:47 25 4
gpt4 key购买 nike

所以我有一个 delegate它指向一些我在第一次创建 delegate 时实际上并不知道的函数目的。稍后将对象设置为某些功能。

然后我还想制作一个表达式树,用一个参数调用委托(delegate)(为了这个问题的缘故,参数可以是 5 )。这是我正在努力的一点;下面的代码显示了我想要的,但无法编译。

Func<int, int> func = null;
Expression expr = Expression.Invoke(func, Expression.Constant(5));

对于这个例子,我可以这样做(这很实用,因为我需要在运行时构建表达式树):

Func<int, int> func = null;
Expression<Func<int>> expr = () => func(5);

这使得 expr成为:

() => Invoke(value(Test.Program+<>c__DisplayClass0).func, 5)

这似乎意味着要使用 delegate func , 我需要制作 value(Test.Program+<>c__DisplayClass0).func位。

那么,我怎样才能创建调用委托(delegate)的表达式树呢?

最佳答案

我认为您想做的是使用要传递的委托(delegate)的 Target 和 Method 属性来创建 Call 表达式。基于 JulianR 的示例,它看起来应该是这样的:

Action<int> func = i => Console.WriteLine(i * i);

var callExpr = Expression.Call(Expression.Constant(func.Target), func.Method, Expression.Constant(5));

var lambdaExpr = Expression.Lambda<Action>(callExpr);
var fn = lambdaExpr.Compile();
fn(); // Prints 25

关于c# - 表达式树和调用委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2215712/

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