表达式树是定义代码的数据结构。 它们基于编译器用于分析代码和生成已编译输出的相同结构。

几种常见的表达式

BinaryExpression 包含二元运算符的表达式

                 BinaryExpression binaryExpression = Expression.MakeBinary(ExpressionType.Add,Expression.Constant(),Expression.Constant());
Console.WriteLine(binaryExpression.ToString());//(1+2) 不进行溢出检查
binaryExpression = Expression.MakeBinary(ExpressionType.AddChecked, Expression.Constant(), Expression.Constant());
Console.WriteLine(binaryExpression.ToString());//(3+4) 进行溢出检查
binaryExpression = Expression.MakeBinary(ExpressionType.Subtract, Expression.Constant(), Expression.Constant());
Console.WriteLine(binaryExpression.ToString());//(5-6) 不进行溢出检查
binaryExpression = Expression.MakeBinary(ExpressionType.SubtractChecked, Expression.Constant(), Expression.Constant());
Console.WriteLine(binaryExpression.ToString());//(7-8) 进行溢出检查
binaryExpression = Expression.MakeBinary(ExpressionType.Multiply, Expression.Constant(), Expression.Constant());
Console.WriteLine(binaryExpression.ToString());//(9*10) 不进行溢出检查
binaryExpression = Expression.MakeBinary(ExpressionType.MultiplyChecked, Expression.Constant(), Expression.Constant());
Console.WriteLine(binaryExpression.ToString());//(11*12) 进行溢出检查
binaryExpression = Expression.MakeBinary(ExpressionType.Divide, Expression.Constant(), Expression.Constant());
Console.WriteLine(binaryExpression.ToString());//(13/14)
binaryExpression = Expression.MakeBinary(ExpressionType.Modulo, Expression.Constant(), Expression.Constant());
Console.WriteLine(binaryExpression.ToString());//(15%16)

BlockExpression 包含一个表达式序列的块,表达式中可定义变量

                 BlockExpression blockExpr = Expression.Block(
Expression.Call(null, typeof(Console).GetMethod("Write", new Type[] { typeof(String) }), Expression.Constant("Hello ")),
Expression.Call(null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }), Expression.Constant("World!")),
Expression.Constant()
);
var result = Expression.Lambda<Func<int>>(blockExpr).Compile()();
Console.WriteLine("**************************");
foreach (var expr in blockExpr.Expressions)
Console.WriteLine(expr.ToString());
Console.WriteLine("**************************");
Console.WriteLine(result);

程序执行结果

ConditionalExpression 具有条件运算符的表达式

Expression conditionExpr = Expression.Condition(Expression.Constant(num > 10),Expression.Constant("num is greater than 10"),Expression.Constant("num is smaller than 10"));

ConstantExpression 具有常数值的表达式

 Expression.Constant(5.5);
Expression.Constant("Hello World!");

DefaultExpression 类型或空表达式的默认值

                 Expression defaultExpr = Expression.Default(typeof(byte));

                 // Print out the expression.
Console.WriteLine(defaultExpr.ToString());// 等价于 default(byte) // The following statement first creates an expression tree,
// then compiles it, and then executes it.
Console.WriteLine(Expression.Lambda<Func<byte>>(defaultExpr).Compile()());//

ParameterExpression 命名的参数表达式

ParameterExpression param = Expression.Parameter(typeof(int));

IndexExpression 编制属性或数组的索引

                 ParameterExpression arrayExpr = Expression.Parameter(typeof(int[]), "Array");
ParameterExpression indexExpr = Expression.Parameter(typeof(int), "Index");
ParameterExpression valueExpr = Expression.Parameter(typeof(int), "Value");
Expression arrayAccessExpr = Expression.ArrayAccess(
arrayExpr,
indexExpr
);//Array[Index]

InvocationExpression 将委托或 lambda 表达式应用于参数表达式列表的表达式

                 Expression<Func<int, int, bool>> largeSumTest =(num1, num2) => (num1 + num2) > ;
InvocationExpression invocationExpression =Expression.Invoke(largeSumTest,Expression.Constant(),Expression.Constant());
Console.WriteLine(invocationExpression.ToString());//Invoke((num1, num2) => ((num1 + num2) > 1000), 539, 281)

LambdaExpression 描述一个 lambda 表达式。 这将捕获与 .NET 方法体类似的代码块

                 ParameterExpression paramExpr = Expression.Parameter(typeof(int), "arg");
LambdaExpression lambdaExpr = Expression.Lambda(Expression.Add(paramExpr,Expression.Constant()),new List<ParameterExpression>() { paramExpr });
Console.WriteLine(lambdaExpr);// arg => (arg +1)

ElementInit   表示 IEnumerable 集合的单个元素的初始值设定项

ListInitExpression 表示包含集合初始值设定项的构造函数调用

NewExpression 构造函数调用

                 string tree1 = "maple";
string tree2 = "oak"; MethodInfo addMethod = typeof(Dictionary<int, string>).GetMethod("Add"); // Create two ElementInit objects that represent the
// two key-value pairs to add to the Dictionary.
ElementInit elementInit1 =Expression.ElementInit(addMethod,Expression.Constant(tree1.Length),Expression.Constant(tree1));
ElementInit elementInit2 =Expression.ElementInit(addMethod,Expression.Constant(tree2.Length),Expression.Constant(tree2)); // Create a NewExpression that represents constructing
// a new instance of Dictionary<int, string>.
NewExpression newDictionaryExpression = Expression.New(typeof(Dictionary<int, string>));//等价 new Dictionary<int, string>(); // Create a ListInitExpression that represents initializing
// a new Dictionary<> instance with two key-value pairs.
ListInitExpression listInitExpression = Expression.ListInit(newDictionaryExpression, elementInit1, elementInit2);//等价 var dic= new Dictionary<int, string>{}; dic.Add(5,"maple");dic.Add(3,"oak"); Console.WriteLine(listInitExpression.ToString());

LoopExpression 无限循环。 可以使用“break”退出它

LabelTarget  表示 GotoExpression 的目标

                 ParameterExpression value = Expression.Parameter(typeof(int), "value");
ParameterExpression result = Expression.Parameter(typeof(int), "result");
LabelTarget label = Expression.Label(typeof(int));
BlockExpression block = Expression.Block(
new[] { result },
Expression.Assign(result, Expression.Constant()),
Expression.Loop(
Expression.IfThenElse(
Expression.GreaterThan(value, Expression.Constant()),
Expression.MultiplyAssign(result,
Expression.PostDecrementAssign(value)),
Expression.Break(label, result)
),
label
)
);
//var s =value=>
//{
// var result = 1;
// for (int i = value; i >1; i--)
// {
// result *= i;
// }
// return result;
//};

MemberAssignment 针对对象的字段或属性的赋值运算

MemberBinding 提供一种基类,该基类派生表示绑定的类,这些绑定用于初始化新创建对象的成员

MemberExpression 访问字段或属性

MemberInitExpression 调用构造函数并初始化新对象的一个或多个成员

MemberListBinding 初始化新创建对象的集合成员的元素

MemberMemberBinding 初始化新创建对象的成员的成员

     public class BaseEntity
{
/// <summary>
/// 创建人账号
/// </summary>
[DataMember]
[Display(Name = "创建人账号")]
[Column]
public string CreateMan { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
[Display(Name = "创建时间")]
public DateTime CreateDateTime { get; set; }
/// <summary>
/// 异动人账号
/// </summary>
[DataMember]
[Display(Name = "异动人账号")]
public string TrMan { get; set; }
/// <summary>
/// 异动时间
/// </summary>
[DataMember]
[Display(Name = "异动时间")]
public DateTime TrDateTime { get; set; }
/// <summary>
/// 时间戳
/// </summary>
[DataMember]
[Display(Name = "时间戳")]
public DateTime? TrVersion { get; set; }
}
                 BaseEntity entity = new BaseEntity();
NewExpression newExp = Expression.New(typeof(BaseEntity)); MemberInfo createMan = typeof(BaseEntity).GetMember("CreateMan")[];
MemberInfo trMan = typeof(BaseEntity).GetMember("TrMan")[];
MemberBinding createManMemberBinding = Expression.Bind(createMan, Expression.Constant("horse"));
MemberBinding trManMemberBinding = Expression.Bind(trMan, Expression.Constant("admin"));
MemberInitExpression memberInitExpression = Expression.MemberInit(newExp, createManMemberBinding, trManMemberBinding); Console.WriteLine(memberInitExpression.ToString());

NewArrayExpression 创建新数组并可能初始化该新数组的元素

                 List<Expression> trees =new List<Expression>()
{
Expression.Constant("oak"),
Expression.Constant("fir"),
Expression.Constant("spruce"),
Expression.Constant("alder")
};
NewArrayExpression newArrayExpression =Expression.NewArrayInit(typeof(string), trees); // new [] {"oak", "fir", "spruce", "alder"}
Console.WriteLine(newArrayExpression.ToString());

SwitchCase  SwitchExpression 的一个事例

SwitchExpression 一个控制表达式,该表达式通过将控制传递到 SwitchCase 来处理多重选择

                 ConstantExpression switchValue = Expression.Constant();
SwitchExpression switchExpr =Expression.Switch(switchValue,new SwitchCase[] {
Expression.SwitchCase(Expression.Call(null,
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
Expression.Constant("First")),Expression.Constant()),
Expression.SwitchCase(Expression.Call(null,
typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }),
Expression.Constant("Second")),Expression.Constant())});
Expression.Lambda<Action>(switchExpr).Compile()();

TryExpression  try/catch/finally/fault 块

CatchBlock  try 块中的 catch 语句

                     TryExpression tryCatchExpr =Expression.TryCatch(
Expression.Block(
Expression.Throw(Expression.Constant(new DivideByZeroException())),
Expression.Constant("Try block")
),
Expression.Catch(
typeof(DivideByZeroException),
Expression.Constant("Catch block")
));

UnaryExpression 包含一元运算符的表达式

UnaryExpression typeAsExpression =Expression.TypeAs(Expression.Constant(34, typeof(int)),typeof(int?));//等价    34 as int?;

微软文档地址:

System.Linq.Expressions:https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.expressions?view=netframework-4.8

ExpressionType:https://docs.microsoft.com/zh-cn/dotnet/api/system.linq.expressions.expressiontype?view=netframework-4.8#System_Linq_Expressions_ExpressionType_Add

C# 表达式树 Expression的更多相关文章

  1. [C#] C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  2. 表达式树 Expression

    转载泛型方法动态生成表达式树 Expression public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> ...

  3. 表达式树(Expression Tree)

    饮水思源 本文并非原创而是下面网址的一个学习笔记 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/e ...

  4. C# 知识回顾 - 表达式树 Expression Trees

    C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...

  5. 泛型方法动态生成表达式树 Expression

    public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> Temp = db.TraderInfo; if ...

  6. jQuery find() 搜索所有段落中的后代 C# find() 第一个匹配元素 Func 有返回值 Action是没有返回值 Predicate 只有一个参数且返回值为bool 表达式树Expression

    所有p后代span Id为 TotalProject 的 select 标签 的后代 option标签 为选中的 text using System; using System.Collections ...

  7. 利用表达式树Expression优化反射性能

    最近做了一个.Net Core环境下,基于NPOI的Excel导入导出以及Word操作的服务封装,涉及到大量反射操作,在性能优化过程中使用到了表达式树,记录一下. Excel导入是相对比较麻烦的一块, ...

  8. 表达式树Expression

    Expression表达式树动态查询 在进行数据列表的查询中,我们通常会使用两种方式进行查询: linq查询 数据库sql语句查询 这样固然可以实现查询,本人之前也都是这么做的,因为查询的条件很少.使 ...

  9. Func委托与表达式树Expression

    最近在写ORM框架,其中遇到一个难点,就是作为框架调用方如何将查询条件传入框架内.其中就用到了Expression. Func委托 要Expression先要了解Func委托,Func委托的样式是: ...

随机推荐

  1. [C++] 头文件中的#ifndef,#define,#endif以及#pragma用法

    想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文 ...

  2. JavaScript之深入对象(二)

    上一篇随笔讲解了构造函数.原型及原型链相关的知识,今天让我们一起来探讨另一个问题:this. 一     this 的指向 1,  函数预编译过程中,this指向window 我们在讲解函数预编译过程 ...

  3. Java网络编程--Netty中的责任链

    Netty中的责任链 设计模式 - 责任链模式 责任链模式(Chain of Responsibility Pattern)是一种是行为型设计模式,它为请求创建了一个处理对象的链.其链中每一个节点都看 ...

  4. 一个js破解教程

    很好的一篇文章,先存着以后用到. 为了防止官网更新修复,存一下版本 https://pan.lanzou.com/b220073/ 密码:这是秘密 这篇文章以 JavaScript 为例讲解了破解的一 ...

  5. 阿里云短信服务开发报错Java.lang.NoClassDefFoundError:com/aliyuncs/exceptions/ClientException

    手机app获取短信验证码功能时候,遇到的问题.使用的是阿里云的短信服务,下载平台demo时运行不报错,但是在service层调用的时候报错 Java.lang.NoClassDefFoundError ...

  6. .Net Core 3.0 稳定版发布啦!

    上个月的月底(9.23-9.25),.NET 开发者大会开始了,这届大会最主要的议题其实就是微软终于将.NET Core 3.0的面纱揭开了,我们也终于了解到了最新版本的.Net Core平台给我们带 ...

  7. TP5安装workerman版本的坑

    今天想在TP5上安装workerman,用于个人学习,然后悲剧的是,第一步就卡住了,根据手册里说的首先通过composer安装 composer require topthink/think-work ...

  8. ng form组件(表单)

    tip: 数据的双向绑定(数据的双向绑定只是针对表单) 实现数据的双向绑定需要在app_module.ts(根模块)中进行注册一些东西 import {FormsModule} from '@angu ...

  9. Redis分布式锁的一点小理解

    1.在分布式系统中,我们使用锁机制只能保证同一个JVM中一次只有一个线程访问,但是在分布式的系统中锁就不起作用了,这时候就要用到分布式锁(有多种,这里指 redis) 2.在 redis当中可以使用命 ...

  10. win10下使用Linux命令

    下载Cygwin安装包 官网下载地址:https://cygwin.com/install.html 执行下载好的安装程序 选择默认安装路径C:\cygwin64即可,可在C:\cygwin64\bi ...