C# Lambda到表达式树的转换

C# Lambda到表达式树的转换,c#,lambda,expression-trees,C#,Lambda,Expression Trees,我会保持简单 如何从lambda中获取表达式树 或者从查询表达式?必须将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; //为您提供一个委托: Func f=x=>x*2; //为您提供表达式树: 表达式

我会保持简单

如何从lambda中获取表达式树


或者从查询表达式?

必须将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;
//为您提供一个委托:
Func f=x=>x*2;
//为您提供表达式树:
表达式g=x=>x*2;

方法参数也是如此。但是,一旦将这样一个lambda表达式指定给
Func
类型,就无法返回表达式树。

Konrad的回答是准确的。您需要将lambda表达式指定给
表达式
,以便编译器生成表达式树。如果您将lambda作为
Func
Action
或其他委托类型,那么您所拥有的只是一组IL指令


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

只是为了扩展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);
//给您一个lambda:
Func f=x=>x*2;
//为您提供表达式树:
表达式g=x=>f(x);

这不会提供原始lamda的表达式树,而是提供一个调用委托的新表达式树。没什么了。问题不在于得到一个等价的表达式。对于内存中的LINQ,这提供了相同的功能。当然,它不能被任何LINQ提供者正确解析。在第一种情况下,委托是比lambda更好的术语。两者都是lambda表达式,一个隐式转换为匿名委托,另一个是表达式树。@nawfal
f
是委托。但是
x=>x*2
是一个lambda表达式(正如您自己所指出的)。你的评论暗示我说了一些不同的话,但我真的没有。你说第二个表达式给你一个表达式树。与此类似,第一个lambda表达式应该给您一个委托,而不是lambda-这就是您的第一个注释。不是吹毛求疵,只是提一下,以便将来对别人有所帮助。@KonradRudolph,谢谢你的提示。我想了解为什么
x=>x*2
可以同时分配给
Func
Expression
x=>x*2的CLR类型是什么?这是否意味着
Func
Expression
派生自同一基本类型?@KFL,lambda表达式本身是作为程序代码键入的表达式,不一定对应于特定类型
Func
Expression
不必从相同的基类型派生,只要说
int
float
时不要从相同的基类型派生
int x=42
float y=42