欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Expression

程序员文章站 2022-07-08 19:52:05
表达式目录树 1.什么是表达式目录树Expression? 表达式目录树是一个数据结构,语法树。 首先我们去看看 Expressions类 ,定义了一个泛型委托类型 TDelegate: 我们先来一个带返回值的委托: 其中m、n是两个Int 类型的参数 通过表达式目录树计算 m*n+2: 通过中间语 ......

表达式目录树

1.什么是表达式目录树expression?

表达式目录树是一个数据结构,语法树。

首先我们去看看 expressions类 ,定义了一个泛型委托类型 tdelegate:

1     // 摘要:
2     //     将强类型化的 lambda 表达式表示为表达式树形式的数据结构。 此类不能被继承。
3     //
4     // 类型参数:
5     //   tdelegate:
6     //     该委托的类型, system.linq.expressions.expression`1 表示。
7     public sealed class expression<tdelegate> : lambdaexpression

我们先来一个带返回值的委托: 其中m、n是两个int 类型的参数

1 func<int, int, int> func = (m, n) => m * n + 2;
//lambda实例化委托  是个方法 是实例化委托的参数
int iresult1 =func.invoke(1,3); //调用执行

通过表达式目录树计算  m*n+2:

1  expression<func<int, int, int>> exp = (m, n) => m * n + 2;
2  int iresult2 = exp.compile().invoke(1, 2);  
//complie()方法将编译表达式树由描述为可执行代码的 lambda 表达式,并生成一个委托,表示 lambda 表达式。所以可以调用invoke方法。

通过中间语言il反编译查看源码 expression<func<int, int, int>> exp = (m, n) => m * n + 2 

 

表达式目录树结构拆分步骤:

Expression

手动拼装表达式目录树  m * n + m + n + 2;

 1  {
 2     //expression<func<int, int, int>> expression = (m, n) => m * n + m + n + 2;
 3     //int iresult = expression.compile().invoke(1, 2);
 4 
 5     parameterexpression m = expression.parameter(typeof(int), "m"); //第一个参数 m
 6     parameterexpression n = expression.parameter(typeof(int), "n");  //第二个参数 n
 7     var constant = expression.constant(2);   //常量 2
 8 
 9     var mutiply = expression.multiply(m, n);  // m*n
10     var plus1 = expression.add(mutiply, m);   // m*n+m
11     var plus2 = expression.add(plus1, n);     //m*n+m+n
12     var plus3 = expression.add(plus2, constant); //m*n+m+n+2 
13     expression<func<int, int, int>> expression = expression.lambda<func<int, int, int>>(plus3, new parameterexpression[] { m, n });
//组装表达式目录树 14 int iresult = expression.compile().invoke(1, 2);//调用 15 }