2009-10-15 16 views
7

Beim Erstellen eines Lambda-Ausdruck von Hand bekomme ich eine Ausnahme "Parameter nicht im Bereich".Lambda-Parameter nicht im Bereich - beim Erstellen binärer Lambda-Ausdruck

Irgendwelche Ideen, was ich falsch mache?

public class OtherType 
    { 
     public string First_Name { get; set; } 
     public string Last_Name { get; set; } 

    } 
    static void Main(string[] args) 
     { 

      Expression<Func<OtherType, bool>> l2 = 
       p => p.First_Name == "Bob"; 
      l2.Compile(); // Works 


      PropertyInfo property = 
       typeof(OtherType).GetProperty("First_Name"); 

      ParameterExpression para = 
       Expression.Parameter(typeof(OtherType), "para"); 

      ConstantExpression right = 
       Expression.Constant("Bob", typeof(string)); 

      MemberExpression left = 
       Expression.Property(Expression.Parameter(typeof(OtherType), "para"), property); 

      BinaryExpression binary = 
       Expression.MakeBinary(ExpressionType.Equal, left, right); 

      Expression<Func<OtherType, bool>> l = 
       Expression.Lambda<Func<OtherType, bool>>(binary, new ParameterExpression[] { para }); 

      l.Compile(); // Get a 'Lambda Parameter not in scope' exception 

} 

Antwort

11

Sie müssen das gleiche Parameterobjekt wiederverwenden. Also, wo du hast:

MemberExpression left = Expression.Property 
    (Expression.Parameter(typeof(OtherType), "para"), property); 

es sein sollte:

MemberExpression left = Expression.Property(para, property); 

Ich weiß, dass es Sinn machen würde, für sie nach dem Namen übereinstimmen, aber das ist einfach nicht die Art, wie es funktioniert :(

Wenn es überhaupt einen Trost gibt, bekomme ich sehr selten von Anfang an handgefertigte Ausdrucksbäume, ich muss sie für eine Weile beschwören, andererseits glaube ich, dass Marc Gravell an kalten Tagen vorsichtig ausatmen kann und sein Atem wird in Form eines perfekten, frostigen Ausdrucksbaumcodes erscheinen ...

+0

Ich musste das ein Dutzend Mal neu lesen, um endlich zu erkennen, was schief läuft. Danke Jon: D –

+0

Drei Jahre später: vielen Dank !!! :) – schglurps

Verwandte Themen