式:APIを使用した式ツリーの作成(5)

10987 ワード

一、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つの構造方法しかなく、生成された効果とデータ式の未知数は1つの意味であり、1つの変数のプレースホルダである.2、ConditionalExpression:構築も容易で、最初のパラメータの計算結果がtrueの場合、2番目のパラメータを実行する.そうでない場合は、3番目のパラメータを実行します.3、このコード(3)では、BlockExpression表現を使用していますが、前述したように、BlockExpressionによってParameterExpressionの付与値を生成し、そのパラメータを使用した式に値を入力する方法を示しています.(3)の式ビューは.Lambda #Lambda1(){.Block(System.Int 32$a,System.Int 32$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);

出力:二等賞