2009-06-16 9 views
3

Ich willmit Binary in C# Fest

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

als Ausdruck Baum implementieren und versuchte

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)); 

Mit Cond entweder ich wahr/falsch, aber nicht der LeftEx oder RightEx die Bedingung zurückgeben soll .

Ich konnte nichts in der Dokumentation finden.

Peter

+0

Vergessen Sie nicht, können Sie immer verwenden Reflektor oder ildasm um zu sehen, welchen Ausdrucksbaumcode der Compiler für Sie generiert. –

Antwort

8

Ich glaube, Sie brauchen nur:

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

bearbeiten - btw - var Ihr Freund hier ist:

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

Ich denke, der Func-Rückgabetyp sollte int sein (Func ) –

+0

(behoben, Prost) –