考虑以下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,但也可以用来调用公共或非公共类型的私有成员,受保护成员和内部成员,以替代反射。