Constant ( )
//创建一个常量表达式,注:Expression会自动生成常量的名字
//示例:
//创建一个表示常量的表达式:string x="寒食"
Expression.Constant( "寒食",typeof(string) )
Variable ( )
//创建一个ParameterExpression表示变量/参数变量表达式
Parameter ( )
//创建一个ParameterExpression表示变量/参数变量表达式
//示例:
Expression.Variable( typeof (int ) , "x" ); /*等同于*/ Expression.Parameter( typeof (int ) , "y" );
PostIncrementAssign ( )
//创建一个UnaryExpression表示自递增表达式,如Expression.PostIncrementAssign(x),表示x++,类似的有PostDecrementAssign表示自递减表达式
Assign ( )
//创建一个BinaryExpression表示赋值表达式,赋值表达式总是有左右两边的操作数
//示例:
BinaryExpression binaryExpression = Expression.Assign ( Expression.Variable ( typeof ( int ) , "x" ) , Expression.Constant ( 2 ) ); //左是x,右是2 int x=2
Console.WriteLine(binaryExpression.ToString ( ) ); //print int x=2
AddAssign ( )
//创建一个BinaryExpression表示加法表达式,加法表达式总是有左右两边的操作数
//试了一下必须将加法表达式放进BlockExpression中,否则无法创建,参看下面的Block ( )方法的演示
DivideAssign ( )
//创建一个BinaryExpression表示除法表达式,除法表达式总是有左右两边的操作数
Lambda ( )
//将一个Expression表达式转换为Expression<Func<TDelegate>> | Expression<Action<TDelegate>> | Expression<Action>
//通常情况下,使用此方法是为了调用一个表示方法调用的表达式或者调用一个块表达式
//如果你想执行表达式树的内容,比如执行表示方法调用的表达式则需要创建MethodCallExpression
//如果你想执行表达式树的内容,比如执行表示非方法调用的计算表达式则需要创建BlockExpression,
//所以,想要表达式得以执行,需要使用MethodCallExpression或BlockExpression定义可执行的表达式,然后使用Lambda ( )将该表达式转换为Expression<T>,再调用Expression<T>.Compile()将其转换为可执行的委托
Call ( Expression expression , MethodInfo method , params Expression [ ] methodParamters )
//创建一个MethodCallExpression表示调用某个方法的表达式,只有表示方法调用的表达式和块表达式可以执行
//方法调用有两种情况:1.对象调用方法 2.类型调用方法 比如:Animal a=new Animal(); a.Show()区别于Animal.Count()
//如果不是对象调用方法则第一个参数可提供null,否则第一个参数需要提供调用方法的对象,对象也必须是一个Expression
//示例:
//假设要为这段代码创建表达式树:Console.WriteLine( ),
MethodCallExpression method = Expression.Call (
null , //无实例调用方法
typeof ( Console ).GetMethod ( "WriteLine" , new Type [ ] { typeof ( string ) } ) , //方法调用的表达式
Expression.Constant ( "寒食" , typeof ( string ) ) //方法的参数
);
Expression<Action> action = Expression.Lambda<Action> ( method );
action.Compile( ) ( ); // print 寒食
//假设要为这段代码创建表达式树:"hello world".ToUpper(),
Expression callExpr = Expression.Call (
Expression.Constant ( "hello world" ) , //有实例调用方法
typeof ( string ).GetMethod ( "ToUpper" , new Type [ ] { } )
);
string newStr = Expression.Lambda<Func<string>> ( callExpr ).Compile ( ) ( ); // HELLO WORLD
Block ( )
//创建一个BlockExpression表示块表达式,只有表示方法调用的表达式和块表达式可以执行
//示例:块中的表达式都是一步一步的定义出来的,创建块表达式时你可以想象一下在块中写C#代码块的流程,这样你就知道下面Block ( )方法的参数(表达式)是如何创建的了
ParameterExpression x = Expression.Parameter( typeof (int ) , "x" ); // int x
ParameterExpression y = Expression.Parameter ( typeof ( int ) , "y" ); // int y
BlockExpression block = Expression.Block (
new ParameterExpression [ ] { x , y } , // int x,int y 定义块作用域中的变量表达式
Expression.Assign ( x , Expression.Constant ( 100 ) ) , //x=100 定义块作用域中的赋值表达式
Expression.Assign ( y , Expression.Constant ( 200 ) ) , //y =200 定义块作用域中的赋值表达式
Expression.AddAssign ( x , y ) // var r = x + y
);
Func<int> func = Expression.Lambda<Func<int>> ( block ).Compile ( );
Console.WriteLine(func ( ) ); // print 300
LessThanOrEqual
//创建一个BinaryExpression表示<=的表达式,类似的有LessThan ( )
GreaterThanOrEqual ( )
//创建一个BinaryExpression表示>=的表达式,类似的有GreaterThan ( )
//示例:
var x = Expression.Parameter ( typeof ( int ) , "x" );
var y = Expression.Parameter ( typeof ( int ) , "y" );
var block = Expression.Block (
new ParameterExpression [ ] { x , y } ,
Expression.Assign ( x , Expression.Constant ( 100000 ) ) ,
Expression.Assign ( y , Expression.Constant ( 200 ) ) ,
Expression.LessThanOrEqual ( x , y ) // x >= y
);
bool IsTrue = Expression.Lambda<Func<bool>> ( block ).Compile ( ) ( );
Console.WriteLine(IsTrue ); // print true
IfThenElse ( Expression expressionForTest , Expression ifTestIsTrue , Expression ifTestIsFlase )
//创建一个ConditionalExpression表示条件语句表达式
//示例:
var x = Expression.Parameter ( typeof ( int ) , "x" );
var y = Expression.Parameter ( typeof ( int ) , "y" );
var block = Expression.Block (
new ParameterExpression [ ] { x , y } ,
Expression.Assign ( x , Expression.Constant ( 100000 ) ) ,
Expression.Assign ( y , Expression.Constant ( 200 ) ) ,
Expression.IfThenElse (
Expression.GreaterThanOrEqual ( x , y ) , // if ( x >= y )
Expression.Call ( null , typeof ( Console ).GetMethod ( "WriteLine" , new Type [ ] { typeof ( string ) } ) , Expression.Constant ( "x>y==true" ) ) , //条件为真时执行
Expression.Call ( null , typeof ( Console ).GetMethod ( "WriteLine" , new Type [ ] { typeof ( string ) } ) , Expression.Constant ( "x>y==false" ) ) //条件为假时执行
)
);
Expression.Lambda<Action>(block ).Compile ( ) ( ); // print x>y==true
Label ( )
//创建一个表示LabelTarget的标签,此标签常用于退出循环,将标签作为Loop ( )方法的最后一个参数,然后在某个条件中使用Expression.Break(LabelTarget )
//参看下面的Loop语句表达式
Break ( )
//退出循环,如果有嵌套循环,嵌套的循环内也得使用此方法来退出嵌套循环
Loop ( )
//创建一个LoopExpression表示循环语句表达式
//示例:
var label = Expression.Label ( typeof ( int ) );
var x = Expression.Variable ( typeof ( int ) , "x" );
var block = Expression.Block (
new [ ] { x } ,
Expression.Assign ( x , Expression.Constant ( 0 ) ) ,
Expression.Loop (
Expression.IfThenElse (
Expression.LessThan (
x ,
Expression.Constant ( 10 )
) ,
Expression.PostIncrementAssign ( x ) ,// x++
Expression.Break ( label , x ) //将x作为标签的值
) ,
label
)
);
int r = Expression.Lambda<Func<int>> ( block ).Compile ( ) ( );
Console.Write(r ); // print 10