解析 Lambda 表达式

我们先创建一个表达式树:

Expression<Func<int, int, int>> expression = (a,b) => a + b;
我们的例子是一个Expression<TDelegate>。Expression<TDelegate>类有四个属性:
  • Body: 得到表达式的主体。
  • Parameters: 得到lambda表达式的参数.
  • NodeType: 获取树的节点的ExpressionType。共45种不同值,包含所有表达式节点各种可能的类型,例如返回常量,例如返回参数,例如取两个值的小值(<),例如取两个值的大值(>),例如将值相加(+),等等。
  • Type: 获取表达式的一个静态类型。在这个例子里,表达式的类型是Func<intintint>

下面就写Code来解析

            Expression<Func<int, int, int>> expression = (a, b) => a + b;
            BinaryExpression body = (BinaryExpression)expression.Body;
            ParameterExpression left = (ParameterExpression)body.Left;
            ParameterExpression right = (ParameterExpression)body.Right;
            Console.WriteLine(expression.Body);
            Console.WriteLine(" 表达式左边部分: " + "{0}{4} 节点类型: {1}{4} 表达式右边部分: {2}{4} 类型: {3}{4}", left.Name, body.NodeType, right.Name, body.Type, Environment.NewLine);
View Code

输出:

  (a + b)
  表达式左边部分: a
  节点类型:  Add
  表达式右边部分: b
  类型: System.Int32

我们可以调用Compile()方法来生成委托对象

int res = expression.Compile()(3, 5); 

这段代码会输出值8,跟本文最初声明的lambda函数的执行结果一样。

 

Expression参考博客:http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html

posted @ 2015-05-24 14:50  ZuQing  阅读(285)  评论(0编辑  收藏  举报