式:APIを使用した式ツリーの作成(5)
10987 ワード
一、ConditionalExpression:式はIIF((a==b)、「aとbは等しい」、「aとbは等しくない」など)式を生成する.次の操作を行います.
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に伝達することによって多重選択を処理する制御式を表す.
出力:二等賞
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
二、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);
出力:二等賞