表达式树摘录(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
表达式树摘录(2

示例
  下面的代码示例演示如何创建一个表达式来表示条件语句。 如果第一个参数的计算结果为 true,则执行第二个参数;否则执行第三个参数。表达式树摘录(2
运行结果:

表达式树摘录(2

 InvocationExpression介绍
      该类封装了表示将委托或lambda表达式应用于参数表达式列表的表达式,主要使用 Invoke工厂方法创建InvocationExpression,它的NodeType为 Invoke。

属性
  Arguments        获取对其应用委托的参数
  Expression        获取要应用的委托或lambda表达式

示例
    下面的示例演示如何使用 Invoke(Expression, Expression[]) 方法创建一个 InvocationExpression,表示使用指定的参数调用 lambda 表达式。

表达式树摘录(2

 

 运行结果:
 表达式树摘录(2 

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 表达式的表达式树,重载
表达式树摘录(2

 

示例
  下面的示例演示了 (a, b) => ((a * b) + 2) 的Lambda表达式创建过程
表达式树摘录(2
运行结果

 

表达式树摘录(2

 

 

ListInitExpression介绍
   该类封装了一个表示包含集合初始值设定项的构造函数调用,主要使用ListInit工厂方法来创建ListInitExpression,它的NodeType属性值为 ListInit

主要属性
  Initializers           获取用于初始化集合的元素初始值设定项, 返回 ReadOnlyCollection<ElementInit>类型
  NewExpression  获取包含对集合类型的构造函数的调用表达式,返回NewExpression  类型

工厂方法
表达式树摘录(2

 示例
      下面的示例创建一个 ElementInit,表示初始化字典集合的一个元素。
 表达式树摘录(2
结果
   表达式树摘录(2MemberExpression介绍
     该类表示访问字段或属性,通过使用Field、Property或PropertyOrField工厂方法创建MemberExpression, 它的NodeType属性值为 MemberAccess

 属性
      Expression      获取字段或属性的包含对象 
表达式树摘录(2
    Member          获取要访问的字段或属性
表达式树摘录(2
工厂方法
   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,表示获取字段成员的值。
表达式树摘录(2表达式树摘录(2
   运行结果:
  表达式树摘录(2

MemberInitExpression介绍
     该类表示调用构造函数并初始化新对象的一个或多个成员,主要通过 MemberInit 工厂方法创建 MemberInitExpression, 它的NodeType值为 MemberInit

主要属性
   Bindings                  获取描述如何初始化新创建对象成员的绑定,返回ReadOnlyCollection<MemberBinding> 类型。
   NewExpression      获取表示构造函数调用的表达式,返回NewExpression  类型。

工厂方法
    MemberInit(NewExpression, IEnumerable<MemberBinding>)            创建一个 MemberInitExpression。
    MemberInit(NewExpression, MemberBinding[] )                                  创建一个 MemberInitExpression。

示例

 

表达式树摘录(2
结果
  表达式树摘录(2 

 

 
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 方法的表达式
表达式树摘录(2表达式树摘录(2
  运行结果:

表达式树摘录(2

 

转载于:https://www.cnblogs.com/fujinliang/archive/2013/02/27/2935949.html