表达式:使用API创建表达式树(5)
一、ConditionalExpression:表达式 生成如 IIF((a == b), "a和b相等", "a与b不相等") 式子。
使用:
ParameterExpression aiP1 = Expression.Parameter(typeof(int), "a"); //(1) ParameterExpression aiP2 = Expression.Parameter(typeof(int), "b"); ParameterExpression aiP3 = Expression.Parameter(typeof(int)); Console.WriteLine(aiP3.ToString()); //输出:Param_0 BinaryExpression aiBnExp = Expression.MakeBinary(ExpressionType.Equal, aiP1, aiP2); ConditionalExpression aiCdExp = Expression.Condition( aiBnExp, Expression.Constant("a和b相等"), Expression.Constant("a与b不相等") ); //(2) Console.WriteLine(aiCdExp.ToString()); //输出:IIF((a == b), "a和b相等", "a与b不相等") LambdaExpression aiLamExp = Expression.Lambda( Expression.Block //(3) ( new ParameterExpression[] { aiP1, aiP2 } , Expression.Assign(aiP1, Expression.Constant(10)) , Expression.Assign(aiP2, Expression.Constant(30)) , aiCdExp )); Console.WriteLine(aiLamExp.Compile().DynamicInvoke()); Console.ReadLine();
1、在上面代码段中的(1)出现的 ParameterExpression 是参数表达示,使用比较简单,但很常用,只有两个构造方法,生成出的效果和数据式子中的未知数是一个意思,是一个变量的占位符。
2、ConditionalExpression:构建也是容易的, 如果第一个参数的计算结果为 true,则执行第二个参数;否则执行第三个参数。
3、在这个代码(3)中,使用了BlockExpression表达示,在前面已经对他的使用有介绍,这里演示的是,如何通过BlockExpression来生成ParameterExpression的赋值,并将值传入使用该参数的表达式中。(3)的表达式视图为
.Lambda #Lambda1<System.Func`1[System.String]>() {
.Block(
System.Int32 $a,
System.Int32 $b) {
$a = 10;
$b = 30;
.If ($a == $b) {
"a和b相等"
} .Else {
"a与b不想等"
}
}
}
因此,如果有参数赋值时,顺序是:1)、参数声明 ;2)、参数赋值;3)、使用此参数(列表)的表达示;
二、SwitchExpression:表示一个控制表达式,该表达式通过将控制传递到 SwitchCase 来处理多重选择。
//构建类似下列代码的表达式 //int i = 1; //switch (i) //{ // case 1: // Console.WriteLine("一等奖"); // break; // case 2: // Console.WriteLine("二等奖"); // break; // case 3: // Console.WriteLine("三等奖"); // break; // default: // Console.WriteLine("鼓励奖"); // break; //} //声明 SwitchCase 的称值参数,相当于 switch (i) ParameterExpression aiSwvP = Expression.Parameter(typeof(int), "i"); //构造 SwitchExpression aiSwvExp = Expression.Switch( aiSwvP // switch (i) , Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }), Expression.Constant("鼓励奖") ) //default 默认事例,此参数没有代码无默认事例 , new SwitchCase[] { //事例 之一,前部分是执行,后部分是合符条件值(与) Expression.SwitchCase( Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }), Expression.Constant("一等奖") ) , Expression.Constant(1) //case 1 ) ,Expression.SwitchCase( Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }), Expression.Constant("二等奖") ), Expression.Constant(2) //case 2 ) ,Expression.SwitchCase( Expression.Call( null, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(String) }), Expression.Constant("三等奖") ) ,Expression.Constant(3) //case 3 ) }); // The following statement first creates an expression tree, // then compiles it, and then runs it. Expression.Lambda<Action>(switchExpr).Compile()(); Expression.Lambda<Action<int>>(aiSwvExp, aiSwvP).Compile().DynamicInvoke(2);
输出:
二等奖
也可发邮件至:azthinker@sina.com
GitHub的https://github.com/azthinker
开源中国 https://gitee.com/azthinker