表达式树基础

表达式树表示树状数据结构中的代码,其中每个节点都是表达式

Expression Trees 支持动态修改可执行代码,在各种数据库中执行 LINQ 查询以及创建动态查询。你可以编译和运行表达式树所代表的代码。

它们还用于动态语言运行时(DLR),以提供动态语言和 .NET Framework 之间的互操作性,并使编译器编写器能够发出表达式树而不是 Microsoft 中间语言(MSIL)。

表达树可以通过创建

  1. 匿名 lambda 表达,
  2. 通过使用 System.Linq.Expressions 命名空间手动。

来自 Lambda 表达式的表达式树

将 lambda 表达式分配给 Expression 类型变量时,编译器会发出代码以构建表示 lambda 表达式的表达式树。

以下代码示例显示如何让 C#编译器创建表示 lambda 表达式 num => num <5 的表达式树。

Expression<Func<int, bool>> lambda = num => num < 5;

使用 API​​表达树

表达式树也使用表达式类创建。此类包含用于创建特定类型的表达式树节点的静态工厂方法。

以下是几种类型的 Tree 节点。

  1. ParameterExpression
  2. MethodCallExpression

以下代码示例演示如何使用 API​​创建表示 lambda 表达式 num => num <5 的表达式树。

ParameterExpression numParam = Expression.Parameter(typeof(int), "num");
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression numLessThanFive = Expression.LessThan(numParam, five);
Expression<Func<int, bool>> lambda1 = Expression.Lambda<Func<int, bool>>(numLessThanFive,new ParameterExpression[] { numParam });