表达式目录树

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

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

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

     // 摘要:
// 将强类型化的 Lambda 表达式表示为表达式树形式的数据结构。 此类不能被继承。
//
// 类型参数:
// TDelegate:
// 该委托的类型, System.Linq.Expressions.Expression`1 表示。
public sealed class Expression<TDelegate> : LambdaExpression

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

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

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

  Expression<Func<int, int, int>> exp = (m, n) => m * n + ;
int iResult2 = exp.Compile().Invoke(, );
//Complie()方法将编译表达式树由描述为可执行代码的 lambda 表达式,并生成一个委托,表示 lambda 表达式。所以可以调用Invoke方法。

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

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

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

  {
//Expression<Func<int, int, int>> expression = (m, n) => m * n + m + n + 2;
//int iResult = expression.Compile().Invoke(1, 2); ParameterExpression m = Expression.Parameter(typeof(int), "m"); //第一个参数 M
ParameterExpression n = Expression.Parameter(typeof(int), "n"); //第二个参数 n
var constant = Expression.Constant(); //常量 2 var mutiply = Expression.Multiply(m, n); // m*n
var plus1 = Expression.Add(mutiply, m); // m*n+m
var plus2 = Expression.Add(plus1, n); //m*n+m+n
var plus3 = Expression.Add(plus2, constant); //m*n+m+n+2
Expression<Func<int, int, int>> expression = Expression.Lambda<Func<int, int, int>>(plus3, new ParameterExpression[] { m, n });
//组装表达式目录树
int iResult = expression.Compile().Invoke(, );//调用
}

最新文章

  1. linux进程管理(上)
  2. python 函数传递方式
  3. java中运算符的优先级
  4. ruby中Hash排序
  5. 添加Ubuntu的库文件路径
  6. python安装(windows)
  7. TortoiseSVN设置比较工具为BeyondCompare
  8. Override ListView getAdapter造成的后果
  9. Window.onload事件
  10. List&lt;T&gt; ForEach break
  11. zoj1074 To the Max
  12. javascript实时保存时出现改动多条记录的bug
  13. 【java】io流之字符输入流:java.io.Reader类及子类的子类java.io.FileReader
  14. LoadRunner常用方法
  15. Springboot 6.Springboot 返回cookies信息的验证和post接口开发及常见错误解决
  16. jmeter遇到问题及解决办法
  17. MR目录结构
  18. 原生js总结
  19. Struts2框架之类型转换 --Struts2框架
  20. GitHub官方Markdown语法教程

热门文章

  1. linux入门--Linux和UNIX的关系及区别
  2. Storm学习笔记 - 消息容错机制
  3. dedecms搜索模板,使用{dede:list}标签调用自定义字段不显示(空白)
  4. 如何让div内的多行文本上下左右居中
  5. vue keep-alive 实现详情返回列表保留页面数据
  6. Docker折腾手记-linux下安装
  7. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-模块管理按子系统进行分类管理
  8. Jenkins持续集成01—Jenkins服务搭建和部署
  9. Centos7破解密码的两种方法--技术流ken
  10. Request.Params