让我们来举一个简单的示例。 以下是一个代码行:
var sum = 1 + 2;
直观地看,整个语句是一棵树:应从根节点开始,浏览到树中的每个节点,以查看构成该语句的代码:
- 具有赋值 (
var sum = 1 + 2;
) 的变量声明语句- 隐式变量类型声明 (
var sum
)- 隐式 var 关键字 (
var
) - 变量名称声明 (
sum
)
- 隐式 var 关键字 (
- 赋值运算符 (
=
) - 二元加法表达式 (
1 + 2
)- 左操作数 (
1
) - 加法运算符 (
+
) - 右操作数 (
2
)
- 左操作数 (
- 隐式变量类型声明 (
1.创建表达式树
1.1Lambda表达式编译器创建法
Expression<Func<int, bool>> lambda = num => num < 5;
1.2Expression抽象类手动创建法
using System.Linq.Expressions;
//手动构建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 });
2.执行表达式树
只有LambdaExpression 或 Expression<TDelegate>类型的表达式树才可以被执行。
若要执行这些表达式树,先调用 Compile 方法来创建一个可执行的委托类型的实例,然后调用该委托类型的实例。
//创建表达式树
Expression<Func<int, bool>> expr = num => num < 5;
//编译表达式树为委托类型的实例
Func<int, bool> result = expr.Compile();
//调用委托类型的实例且打印结果到控制台
Console.WriteLine(result(4));
//输出:True.
//简化写法
Console.WriteLine(expr.Compile()(4));
//也输出:True.
3.解析(Parsing)表达式树
// Add the following using directive to your code file:
// using System.Linq.Expressions;
// Create an expression tree.
Expression<Func<int, bool>> exprTree = num => num < 5;
// Decompose the expression tree.
ParameterExpression param = (ParameterExpression)exprTree.Parameters[0];
BinaryExpression operation = (BinaryExpression)exprTree.Body;
ParameterExpression left = (ParameterExpression)operation.Left;
ConstantExpression right = (ConstantExpression)operation.Right;
Console.WriteLine("Decomposed expression: {0} => {1} {2} {3}",
param.Name, left.Name, operation.NodeType, right.Value);
// This code produces the following output:
// Decomposed expression: num => num LessThan 5
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/experience/csharpe/14363.html