c#简单实现表达式目录树(表达)

  

1。什么是表达式目录树:简单的说是一种语法树,或者说是一种数据结构(表达式)

  

2。用λ声明表达式目录树:,

        Expression比;经验值=(n, m)=比;n * m + 2;//表达试目录树的方法体只能是一行,不能有大括号比。如://Expression比;exp1=(m, n)=比;//{//返回m * n + 2;//};      

, 3. expression.compile ();

        Funcfunc=(m, n)=比;m * n + 2;   Expression比;经验值=(m, n)=比;m * n + 2;   int iResult1=函数。调用(99、99);   int iResult2=exp.Compile ()。调用(99、99);      

iResult1和iResult2的结果一样,但是能编译()的只有LambdaExpression。编译()是将表达式树描述的λ表达式编译为可执行代码,并生成表示该λ表达式的委托.exp.Compile () .Invoke(99、99)相当于这样调用exp.Compile () ();

  

4。認識表达式目录树结构。把上面的表达式拆分就是如下图,小学数学知识里的,按照运算符优先级别,先算乘法、m * n,得出结果再算加法,加上2 .

  

 C #简单实现表达式目录树(表达式)

  

如代码所示,m和n是参数,所以类型为ParameterExpression, 2是常量,常量类型是ConstantExpression, MultiplyAssign乘法,添加加法。第六步中只能执行表示λ表达式的表达式目录树,即LambdaExpression或者Expression类型。如果表达式目录树不是表示λ表达式,需要调用λ方法创建一个新的表达式.actExpression.Compile()成委托,再调用。

        {   ParameterExpression左=Expression.Parameter (typeof (int),“m”);//左边的参数   ParameterExpression右=Expression.Parameter (typeof (int),“n”);//右边的参数   ConstantExpression constantlExp=Expression.Constant (2, typeof (int));//常量2   BinaryExpression binaryExpMult=表达式。MultiplyAssign(左、右);//两个参数相乘   BinaryExpression binaryExpAdd=表达式。Add (binaryExpMult constantlExp);//相乘的结果再加2   Expression比;actExpression=Expression.Lambda祝辞(binaryExpAdd,左,右);   int结果=actExpression.Compile()(2,1);//调用   Console.WriteLine(结果+ " ");   }      

,一些表达式目录树常用的类型

  

 C #简单实现表达式目录树(表达式)

  

, 5。表达式目录树+缓存

        使用系统;   使用System.Collections.Generic;   使用来;   使用text;   使用System.Threading.Tasks;   名称空间ThreeHomeWork.Model   {   公开课的学生   {   公共int Id{得到;设置;}   公共字符串名称{;设置;}   公共int年龄{得到;设置;}   }   公开课StudentDto   {   公共int Id{得到;设置;}   公共字符串名称{;设置;}   公共int年龄{得到;设置;}   }   }      

有时候一些业务模型和实体模型不太一样,比如学生于StudentDto实体的转换

  

一般的写法,新的一个实体然后把值赋给另一个实体,有一个就写一个,有十个就写是个,代码写死了,硬编码性能高

        {   学生学生=new(){=12岁Id=1, Name="晴天"};   StudentDto StudentDto=new StudentDto ()   {   Name=student.Name,   Id=student.Id,   年龄=student.Age   };   }      

第二种:使用表达式表达式目录树

        Expression比;λ=p=比;新StudentDto   {   年龄=p.a ge,   Id=p.Id,   Name=p.Name   };   lambda.Compile () .Invoke(学生),      

01。使用字典缓存表达式树,第一步是实例化了一个命令参数,<代码> parameterExpression,,ListmemberBindingList=new List(); 是一个对象成员集合列表,循环兜售的所有公共的属性和字段,添加到memberBindingList集合中,然后使用MemberInitExpression初始化多个对象拼装再调用。第一次调用动态拼装,组装了一个钥匙放入字典中,缓存之后,就直接调用字典中的数据。缓存后的就是硬编码所以性能高。

        使用系统;   使用System.Collections.Generic;   使用来;   使用System.Linq.Expressions;   使用text;   使用System.Threading.Tasks;      名称空间ThreeHomeWork.MappingExtend   {///& lt; summary>///生成表达式目录树。字典缓存///& lt;/summary>   公开课ExpressionMapper   {   私有静态Dictionary

c#简单实现表达式目录树(表达)