2009-10-15 9 views
7

Lors de la création manuelle d'une expression lambda, j'obtiens une exception 'Parameter not in scope'.Lambda Paramètre non inclus dans la portée - lors de la construction de l'expression binaire lambda

Des idées sur ce que je fais mal?

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 

} 

Répondre

11

Vous devez réutiliser le même objet de paramètre. Alors, où vous avez:

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

il devrait être:

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

Je sais que ce serait logique pour eux de match par nom, mais qui est tout simplement pas la façon dont il fonctionne :(

Si c'est une consolation, il m'arrive très rarement d'obtenir des arbres d'expression construits à la main la première fois, je dois les jurer pendant un certain temps, mais je crois que par temps froid, Marc Gravell peut expirer et son souffle sortira sous la forme d'un code d'arbre d'expression parfait, givré ...

+0

J'ai dû relire ceci une douzaine de fois pour enfin comprendre ce qui ne va pas. Merci Jon: D –

+0

Trois ans plus tard: merci beaucoup !!! :) – schglurps

Questions connexes