表达式树(Expression Tree)详解

让我们来举一个简单的示例。 以下是一个代码行:

var sum = 1 + 2;

直观地看,整个语句是一棵树:应从根节点开始,浏览到树中的每个节点,以查看构成该语句的代码:

  • 具有赋值 (var sum = 1 + 2;) 的变量声明语句
    • 隐式变量类型声明 (var sum)
      • 隐式 var 关键字 (var)
      • 变量名称声明 (sum)
    • 赋值运算符 (=)
    • 二元加法表达式 (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

(4)
上一篇 2022年3月12日 23:27
下一篇 2022年5月1日 01:16

相关推荐

发表回复

登录后才能评论