2009-10-15 35 views
7

当手动创建lambda表达式时,我得到'Parameter not in scope'异常。Lambda参数不在范围内 - 构建二进制lambda表达式时

任何想法,我在做什么错?

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 

} 

回答

11

您需要重用相同的参数对象。那么,你有:

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

它应该是:

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

我知道这将是有意义的他们的名字相匹配,但是这只是不是它的工作方式:(

如果真的有什么安慰的话,我很少第一次得到手工制作的表情树,我必须在他们身上发誓一阵子。另一方面,我相信在寒冷的日子里,Marc Gravell可以小心地呼气他的呼吸会以完美,冰冷的表情树代码的形式出现......

+0

我不得不重新读这十几遍才终于意识到出了什么问题。感谢乔恩:D – 2010-06-17 06:05:36

+0

三年后:非常感谢! :) – schglurps 2012-12-10 17:12:17