.NET Framework C#编译器生成的简单表达式树

示例

考虑以下C#代码

Expression<Func<int, int>> expression = a => a + 1;

因为C#编译器认为lambda表达式被分配给Expression类型而不是委托类型,所以它生成的表达式树与该代码大致等效

ParameterExpression parameterA = Expression.Parameter(typeof(int), "a");
var expression = (Expression<Func<int, int>>)Expression.Lambda(
                                                 Expression.Add(
                                                     parameterA,
                                                     Expression.Constant(1)),
                                                 parameterA);

树的根是lambda表达式,其中包含主体和参数列表。lambda具有1称为“ a”的参数。该主体是CLR类型BinaryExpression和NodeType of Add的单个表达式。此表达式表示加法。它有两个子表达式,分别表示为Left和Right。左侧是参数“ a”的ParameterExpression,右侧是值为1的ConstantExpression。

该表达式最简单的用法是打印它:

Console.WriteLine(expression); //prints a => (a + 1)

打印等效的C#代码。

表达式树可以编译为C#委托并由CLR执行

Func<int, int> lambda = expression.Compile();
Console.WriteLine(lambda(2)); //版画3

通常,表达式可以翻译成其他语言,例如SQL,但也可以用来调用公共或非公共类型的私有成员,受保护成员和内部成员,以替代反射。