标签:
简单说下表达式树。
表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等。
表达式树还能用于动态语言运行时 (DLR) 以提供动态语言和 .NET Framework 之间的互操作性,同时保证编译器编写员能够发射表达式树而非 Microsoft 中间语言 (MSIL)。
若 lambda 表达式被分配给 Expression<TDelegate> 类型的变量,则编译器可以发射代码以创建表示该 lambda 表达式的表达式树。
C# 编译器只能从表达式 lambda (或单行 lambda)生成表达式树。
下列代码示例使用关键字 Expression创建表示 lambda 表达式:
1 Expression<Action<int>> actionExpression = n => Console.WriteLine(n); 2 Expression<Func<int, bool>> funcExpression1 = (n) => n < 0; 3 Expression<Func<int, int, bool>> funcExpression2 = (n, m) => n - m == 0;
通过 API 创建表达式树需要使用 Expression 类
下列代码示例展示如何通过 API 创建表示 lambda 表达式:num => num == 0
1 //通过 Expression 类创建表达式树 2 // lambda:num => num == 0 3 ParameterExpression pExpression = Expression.Parameter(typeof(int)); //参数:num 4 ConstantExpression cExpression = Expression.Constant(0); //常量:0 5 BinaryExpression bExpression = Expression.MakeBinary(ExpressionType.Equal, pExpression, cExpression); //二元表达式:num == 0 6 Expression<Func<int, bool>> lambda = Expression.Lambda<Func<int, bool>>(bExpression, pExpression); //lambda 表达式:num => num == 0
代码使用 Expression 类的静态方法进行创建。
下列代码示例展示如何分解表示 lambda 表达式 num => num == 0 的表达式树。
1 Expression<Func<int, bool>> funcExpression = num => num == 0; 2 3 //开始解析 4 ParameterExpression pExpression = funcExpression.Parameters[0]; //lambda 表达式参数 5 BinaryExpression body = (BinaryExpression)funcExpression.Body; //lambda 表达式主体:num == 0 6 7 Console.WriteLine($"解析:{pExpression.Name} => {body.Left} {body.NodeType} {body.Right}");
Expression<TDelegate> 类型提供了 Compile 方法以将表达式树表示的代码编译成可执行委托。
示例
1 //创建表达式树 2 Expression<Func<string, int>> funcExpression = msg => msg.Length; 3 //表达式树编译成委托 4 var lambda = funcExpression.Compile(); 5 //调用委托 6 Console.WriteLine(lambda("Hello, World!")); 7 8 //语法简化 9 Console.WriteLine(funcExpression.Compile()("Hello, World!"));
【原文链接】http://www.cnblogs.com/liqingwen/p/5868688.html
预览版,更新于09/16 05:01
[C#] 说说表达式树 - Expression Trees
标签:
原文地址:http://www.cnblogs.com/liqingwen/p/5868688.html