LAMBDA表达式树转换(Lambda to Expression tree conversion)

2019-07-02 18:57发布

我会保持它很简单,

如何获取表达式树了拉姆达的?

或从查询表达式?

Answer 1:

你必须将拉姆达为不同的类型:

// Gives you a delegate:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => x * 2;

这同样适用于方法的参数。 但是,一旦你分配这样的lambda表达式到Func<>类型,你不能得到表达式树回来。



Answer 2:

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

如果你真的需要能够到IL-编译拉姆达转换回一个表达式树,你必须编译它(例如做卢茨Roeder的反射工具做什么)。 我建议有一个看塞西尔库,它提供了先进的IL操作支持,可以为您节省相当长的一段时间。



Answer 3:

只是为了扩大康拉德的回答,并纠正皮埃尔,你仍然可以生成从IL-编译拉姆达的表达,但它并不十分优雅。 增强康拉德的例子:

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

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


文章来源: Lambda to Expression tree conversion