【问题标题】:Execute LambdaExpression and get returned value as object执行 LambdaExpression 并获取返回值作为对象
【发布时间】:2013-08-01 15:29:00
【问题描述】:

有没有干净的方法来做到这一点?

Expression<Func<int, string>> exTyped = i => "My int = " + i;
LambdaExpression lambda = exTyped;

//later on:

object input = 4;
object result = ExecuteLambdaSomeHow(lambda, input);
//result should be "My int = 4"

这应该适用于不同的类型。

【问题讨论】:

  • 为什么不只是var func = new Func&lt;int, string&gt;(x =&gt; { return string.Format("My int = {0}", x); });
  • @PoweredByOrange 我假设问题很简单。
  • @Kevin 有道理,否则一个简单的string.Format() 就可以了:)
  • 为什么要使用后期绑定 (DynamicInvoke)。如果可能的话,我会尽量避免这种情况(因为你没有编译时检查;因此你很可能会遇到运行时错误)。
  • @Styxxy 好点!我已经相应地更新了我的答案。

标签: c# lambda expression


【解决方案1】:

当然……你只需要编译你的 lambda 然后调用它……

object input = 4;
var compiledLambda = lambda.Compile();
var result = compiledLambda.DynamicInvoke(input);

Styxxy 提出了一个很好的观点......让编译器帮助你会更好。注意下面代码中的编译表达式输入和结果都是强类型的。

var input = 4;
var compiledExpression = exTyped.Compile();
var result = compiledExpression(input);

【讨论】:

  • compiledLambda.Invoke(input); 在这里可能是一个更好的选择,如果确切的类型被称为@Styxxy 指出。 InvokeDynamicInvoke 更快,因为发生的反射较少,请参阅 stackoverflow.com/questions/12858340/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-26
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-04
  • 2020-03-02
相关资源
最近更新 更多