表达式树摘录(2
面学习了一些相对比较简单的表达式,如:ConstantExpression、ParameterExpression、UnaryExpression、BinaryExpression、NewExpression、NewArrayExpression 、TypeBinaryExpression表达式,本篇将学习剩下几个表达式.
本文内容
ConditionalExpression介绍 表示条件的表达式
InvocationExpression介绍 表示将委托或lambda表达式应用于参数表达式列表的表达式
LambdaExpression介绍 表示一个Lambda表达式
ListIntiExpression介绍 表示一个表示包含集合初始值设定项的构造函数调用
MemberExpression介绍 表示一个访问字段或属性的表达式
MemberInitExpression介绍
MethodCallExpression介绍 表示调用一种方法表达式
ConditionalExpression介绍
该类封装包含条件运算符的表达式,主要通过 Condition 工厂方法创建ConditionalExpression,它的NodeType为 Conditional。
属性
IfFalse 获取当测试的计算结果为false时要执行的表达式
IfTrue 获取当测试的计算结果为true时要执行的表达式
Test 获取条件运算的测试
工厂方法Condition
示例
下面的代码示例演示如何创建一个表达式来表示条件语句。 如果第一个参数的计算结果为 true,则执行第二个参数;否则执行第三个参数。
运行结果:
InvocationExpression介绍
该类封装了表示将委托或lambda表达式应用于参数表达式列表的表达式,主要使用 Invoke工厂方法创建InvocationExpression,它的NodeType为 Invoke。
属性
Arguments 获取对其应用委托的参数
Expression 获取要应用的委托或lambda表达式
示例
下面的示例演示如何使用 Invoke(Expression, Expression[]) 方法创建一个 InvocationExpression,表示使用指定的参数调用 lambda 表达式。
LambdaExpression介绍
该类封装了一个Lambda表达式。LambdaExpression 类型以表达式目录树的形式表示 lambda 表达式。Expression<TDelegate> 类型派生自 LambdaExpression,它能够更加显式地捕获 lambda 表达式的类型,也可以用于表示 lambda 表达式。在运行时,表示 lambda 表达式的表达式目录树节点始终属于类型Expression<TDelegate>.
LambdaExpression 的 NodeType 属性的值为 Lambda。
使用 Lambda 工厂方法可创建 LambdaExpression 对象。
成员
Body 获取Lambda表达式的主体
Parameters 获取Lambda表达式的参数
Compile()方法 主要用于生成表示Lambda表达式的委托。
Lambda工厂方法
创建一个表示 lambda 表达式的表达式树,重载
示例
下面的示例演示了 (a, b) => ((a * b) + 2) 的Lambda表达式创建过程
运行结果
ListInitExpression介绍
该类封装了一个表示包含集合初始值设定项的构造函数调用,主要使用ListInit工厂方法来创建ListInitExpression,它的NodeType属性值为 ListInit
主要属性
Initializers 获取用于初始化集合的元素初始值设定项, 返回 ReadOnlyCollection<ElementInit>类型
NewExpression 获取包含对集合类型的构造函数的调用表达式,返回NewExpression 类型
工厂方法
示例
下面的示例创建一个 ElementInit,表示初始化字典集合的一个元素。
结果
MemberExpression介绍
该类表示访问字段或属性,通过使用Field、Property或PropertyOrField工厂方法创建MemberExpression, 它的NodeType属性值为 MemberAccess
属性
Expression 获取字段或属性的包含对象
Member 获取要访问的字段或属性
工厂方法
Field(Expression, FieldInfo) 创建一个表示访问字段的 MemberExpression。
Field(Expression, String) 在给定字段名称的情况下,创建一个表示访问此字段的 MemberExpression。
Property(Expression, MethodInfo) 使用属性访问器方法创建一个表示访问属性的 MemberExpression。
Property(Expression, PropertyInfo) 创建一个表示访问属性的 MemberExpression
Property(Expression, String) 在给定属性名称的情况下,创建一个表示访问此属性的MemberExpression。
PropertyOrField(Expression, String) 在给定属性或字段的名称的情况下,创建一个表示访问此属性或字段的MemberExpression。
示例
下面的示例创建一个 MemberExpression,表示获取字段成员的值。
运行结果:
MemberInitExpression介绍
该类表示调用构造函数并初始化新对象的一个或多个成员,主要通过 MemberInit 工厂方法创建 MemberInitExpression, 它的NodeType值为 MemberInit
主要属性
Bindings 获取描述如何初始化新创建对象成员的绑定,返回ReadOnlyCollection<MemberBinding> 类型。
NewExpression 获取表示构造函数调用的表达式,返回NewExpression 类型。
工厂方法
MemberInit(NewExpression, IEnumerable<MemberBinding>) 创建一个 MemberInitExpression。
MemberInit(NewExpression, MemberBinding[] ) 创建一个 MemberInitExpression。
示例
结果
MethodCallExpression介绍
该类表示调用一种方法, 可以使用Call、 ArrayIndex 工厂方法创建MethodCallExpression。 它的NodeType属性值为 Call。
属性
Arguments 获取被调用方法的参数 public ReadOnlyCollection<Expression> Arguments { get; }
Method 获取被调用的方法 public MethodInfo Method { get; }
Object 获取方法接收的对象 public Expression Object { get; }
工厂方法
Call(Expression, MethodInfo) 创建一个表示调用不带参数的方法的 MethodCallExpression
Call(MethodInfo, Expression[]) 创建一个表示调用static方法的 MethodCallExpression
Call(Expression, MethodInfo, IEnumerable<Expression>) 创建一个表示调用带参数的方法的 MethodCallExpression
Call(Expression, MethodInfo, Expression[]) 创建一个表示调用带参数的方法的 MethodCallExpression
Call(Expression, String, Type[], Expression[]) 通过调用适当的工厂方法创建一个表示调用实例方法的 MethodCallExpression
Call(Type, String, Type[], Expression[]) 通过调用适当的工厂方法创建一个表示调用static方法的 MethodCallExpression
ArrayIndex(Expression, IEnumerable<Expression>) 创建一个表示对秩大于1的数组应用数组索引运算符的 MethodCallExpression
ArrayIndex(Expression, Expression) 创建一个表示对秩为1 的数组应用数组索引运算符的 BinaryExpression
ArrayIndex(Expression, Expression[]) 创建一个表示对秩大于1的数组应用数组索引运算符的 MethodCallExpression。
示例
下面的示例演示如何创建调用采用一个参数的 static 方法的表达式
运行结果: