2009-10-15 38 views
7

Khi tạo biểu thức lambda bằng tay, tôi nhận được ngoại lệ 'Tham số không nằm trong phạm vi'.Tham số Lambda không nằm trong phạm vi - trong khi xây dựng biểu thức lambda nhị phân

Bất kỳ ý tưởng nào về những gì tôi đang làm sai?

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 

} 

Trả lời

11

Bạn cần sử dụng lại cùng một đối tượng tham số. Vì vậy, nơi bạn đã có:

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

nó nên là:

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

Tôi biết nó sẽ có ý nghĩa đối với họ để phù hợp theo tên, nhưng đó chỉ là không phải là cách nó hoạt động :(

Nếu có bất kỳ sự an ủi nào, tôi rất hiếm khi có được những cây biểu hiện được xây dựng bằng tay ngay từ lần đầu tiên, tôi phải thề với họ một thời gian, tôi tin rằng vào những ngày đủ lạnh, Marc Gravell có thể thở ra một cách cẩn thận và hơi thở của anh ta sẽ xuất hiện dưới dạng mã cây biểu hiện hoàn hảo, giá lạnh ...

+0

Tôi đã phải đọc lại hàng chục lần này để cuối cùng nhận ra những gì đang xảy ra. Cảm ơn Jon: D –

+0

Ba năm sau: cảm ơn nhiều !!! :) – schglurps