36
A
回答
50
您必须将拉姆达分配给不同的类型:
// 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<>
类型,就不能得到表达式树。
10
康拉德的回答是确切的。您需要将lambda表达式分配给Expression<Func<...>>
以便编译器生成表达式树。如果您得到的lambda为Func<...>
,Action<...>
或其他委托类型,那么您拥有的只是一堆IL指令。
如果您确实需要能够将IL编译的lambda转换回表达式树,则必须对其进行反编译(例如,执行Lutz Roeder的Reflector工具)。我建议看看Cecil库,它提供了先进的IL操作支持,可以为您节省相当长的一段时间。
6
为了扩大Konrad的答案并纠正Pierre,你仍然可以从IL编译的lambda生成一个表达式,尽管它并不优雅。增加Konrad的例子:
// Gives you a lambda:
Func<int, int> f = x => x * 2;
// Gives you an expression tree:
Expression<Func<int, int>> g = x => f(x);
相关问题
- 1. lambda表达式树
- 2. Lambda表达式转换
- 3. Lambda表达式Java转换
- 4. 表达式树转换
- 5. 转换表达式树
- 6. 转换List.Contains到表达式树
- 7. “与语句体lambda表达式不能转换为表达式树”
- 8. 如何将IQueryable表达式树转换为Lambda
- 9. 需要帮助将lambda转换为表达式树
- 10. 转换LINQ到SQL表达式表达式树
- 11. c#FsCheck无法转换lambda表达式
- 12. 将LINQ转换为lambda表达式
- 13. 将此LINQ表达式转换为Lambda
- 14. Linq查询转换为lambda表达式?
- 15. 转换lambda表达式字符串
- 16. c#HtmlHelper不能转换lambda表达式
- 17. 转换为LINQ lambda表达式
- 18. 将C#lambda表达式转换为VB
- 19. 在Dispatcher.Invoke转换lambda表达式
- 20. 转换Lambda表达式参数类型
- 21. lambda表达式都被转换为BiConsumer
- 22. 带有语句正文的lambda表达式无法转换为表达式树(Lambda和Linq)
- 23. 转换布尔表达式树专家
- 24. 转换Boost C++ Phoenix表达式树
- 25. 如何转换表达式树?
- 26. 表达式树复制或转换
- 27. 转换包含表达式树
- 28. 变换lambda表达式
- 29. 哪里有表达式转换为表达式树并解决?
- 30. 相关实体的Lambda表达式树
在第一种情况下,代表是比lambda更好的术语。两者都是lambda表达式,一个隐式转换为匿名委托,另一个表达式树。 – nawfal 2013-12-18 15:34:47
@nawfal *'f' *是一个代表。但是'x => x * 2'是一个lambda表达式(就像你自己记下的那样)。你的评论意味着我说了一些不同的东西,但我确实没有。 – 2013-12-18 15:59:03
你说第二个表达式给你一个表达式树。类似的,第一个lambda表达式应该*给你一个委托*,而不是* lambda * - 这是你的第一个评论。不要挑剔,只是提及以便在将来帮助某人。 – nawfal 2013-12-18 16:02:06