Lambda到Expression树的转换

Pra*_*dda 39 c# lambda expression-trees

我会保持简单,

如何从lambda中获取表达式树?

或者从查询表达式?

Kon*_*lph 56

您必须将lambda分配给其他类型:

// Gives you a delegate:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => x * 2;
Run Code Online (Sandbox Code Playgroud)

方法参数也是如此.但是,一旦将这样的lambda表达式分配给Func<>类型,就无法返回表达式树.

  • 在第一种情况下,代表是比lambda更好的术语.两者都是lambda表达式,一个隐式转换为匿名委托,另一个是表达式树. (3认同)
  • @KFL,lambda 表达式本身是您作为程序代码键入的表达式,不一定对应于特定类型。``Func&lt;a, b&gt;`` 和 ``Expression&lt;Func&lt;a, b&gt;&gt;`` 不必从相同的基类型派生,只需 ``int`` 和 ``float`` 不当你说 ``int x = 42`` 和 ``float y = 42`` 时,t 派生自相同的基类型 (2认同)

Pie*_*aud 10

康拉德的答复是准确的.您需要将lambda表达式赋值给Expression<Func<...>>编译器以生成表达式树.如果你得到一个lambda作为Func<...>,Action<...>或其他委托类型,你已经是一堆的IL指令.

如果你真的需要能够将IL编译的lambda转换回表达式树,你必须对它进行反编译(例如,做Lutz Roeder的Reflector工具).我建议看一下Cecil库,它提供高级的IL操作支持,可以为你节省很多时间.


jon*_*iba 8

只是为了扩展Konrad的答案,并纠正皮埃尔,你仍然可以从IL编译的lambda中生成一个Expression,尽管它并不是非常优雅.增加康拉德的例子:

// Gives you a lambda:
Func<int, int> f = x => x * 2;

// Gives you an expression tree:
Expression<Func<int, int>> g = x => f(x);
Run Code Online (Sandbox Code Playgroud)

  • 这个**不会**给你原始lamda的表达式树,它会给你一个**新的**表达式树来调用委托.而已. (13认同)