你的位置:首页 > ASP.net教程

[ASP.net教程][C#] 说说表达式树


说说表达式树 - Expression Trees

  简单说下表达式树。

 

目录

 

介绍

  表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等。

  你可以对表达式树中的代码进行编辑和运算。这样能够动态修改可执行代码、在不同数据库中执行 LINQ 查询以及创建动态查询。 

  表达式树还能用于动态语言运行时 (DLR) 以提供动态语言和 .NET Framework 之间的互操作性,同时保证编译器编写员能够发射表达式树而非 Microsoft 中间语言 (MSIL)。 

 

一、根据 Lambda 表达式创建表达式树

  若 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 创建表达式树

  通过 API 创建表达式树需要使用 Expression 类

  下列代码示例展示如何通过 API 创建表示 lambda 表达式:num => num == 0

1       //通过 Expression 类创建表达式树2       // lambda:num => num == 03       ParameterExpression pExpression = Expression.Parameter(typeof(int));  //参数:num4       ConstantExpression cExpression = Expression.Constant(0);  //常量:05       BinaryExpression bExpression = Expression.MakeBinary(ExpressionType.Equal, pExpression, cExpression);  //二元表达式:num == 06       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 == 06 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