2009-06-16 19 views
3

私は式ツリーとしてC#でBinaryExpressionをで立ち往生

Expression<Func<int, int, int>> Max = (p1,p2) => p1 > p2 ? p1:p2; 

を実装したいとCondの私のどちらかが真/偽取得ではなくLeftExや条件は返す必要がありますRightExで

ParameterExpression LeftEx = Expression.Parameter(typeof(int), "p1"); 
ParameterExpression RightEx = Expression.Parameter(typeof(int), "p2"); 
BinaryExpression GroesserAls = Expression.GreaterThan(LeftEx, RightEx); 
ConditionalExpression Cond = BinaryExpression.Condition(GroesserAls, LeftEx, RightEx); 
Expression main = Cond.Test; 
Expression<Func<int, int, bool>> Lam = Expression.Lambda<Func<int, int, bool>>(main, 
    new ParameterExpression[] { LeftEx, RightEx }); 
Console.WriteLine(Lam.Compile().Invoke(333, 1200)); 

を試してみました。

ドキュメントに何も見つかりませんでした。

ピーター

+0

忘れないでください、あなたは常にリフレクターやILDASMを使用することができますがコンパイラがあなたのために生成する式ツリーコードを確認してください。 –

答えて

8

私はあなただけの必要があると思う:

Expression<Func<int, int, int>> Lam = 
    Expression.Lambda<Func<int, int, int>>(Cond, // <=== HERE 
     new ParameterExpression[] { LeftEx, RightEx }); 

編集 - ところで - varここにあなたの友人である:

var p1 = Expression.Parameter(typeof(int), "p1"); 
    var p2 = Expression.Parameter(typeof(int), "p2"); 
    var body = Expression.Condition(Expression.GreaterThan(p1, p2), p1, p2); 
    var lambda = Expression.Lambda<Func<int, int, int>>(body, p1, p2); 
    var func = lambda.Compile(); 
    Console.WriteLine(func(333,1200)); 
    Console.WriteLine(func(1200,333)); 
+0

私はFuncの戻り値の型はint(Func ) –

+0

(固定、歓声) –

関連する問題