49

我会保持非常简单,

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

还是从查询表达式?

4

3 回答 3

67

您必须将 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;

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

于 2009-08-21T08:43:02.063 回答
11

康拉德的回答是准确的。您需要将 lambda 表达式分配给Expression<Func<...>>,以便编译器生成表达式树。如果你得到一个 lambda或其他委托类型Func<...>Action<...>那么你所拥有的只是一堆 IL 指令。

如果您确实需要能够将 IL 编译的 lambda 转换回表达式树,则必须对其进行反编译(例如,执行 Lutz Roeder 的 Reflector 工具所做的事情)。我建议看一下Cecil库,它提供了高级 IL 操作支持,可以为您节省相当多的时间。

于 2009-08-21T08:57:51.127 回答
8

只是为了扩展 Konrad 的答案并纠正 Pierre,您仍然可以从 IL 编译的 lambda 生成表达式,尽管它不是非常优雅。扩充康拉德的例子:

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

// Gives you an expression tree:
Expression<Func<int, int>> g = x => f(x);
于 2011-01-18T14:43:42.547 回答