表达式:使用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);

输出:
     二等奖

 

你可能感兴趣的:(api)