一、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);
輸出: 二等獎
新聞熱點
疑難解答