Lambda参数不在范围内 – 构建二进制lambda表达式时

手动创建lambda表达式时,我得到一个“参数不在范围内”的exception。

关于我做错了什么的任何想法?

public class OtherType { public string First_Name { get; set; } public string Last_Name { get; set; } } static void Main(string[] args) { Expression<Func> 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> l = Expression.Lambda<Func>(binary, new ParameterExpression[] { para }); l.Compile(); // Get a 'Lambda Parameter not in scope' exception } 

您需要重用相同的参数对象。 那你在哪里:

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

它应该是:

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

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

如果它有任何安慰,我很少第一次得到手工制作的表达树。 我必须向他们发誓一段时间。 另一方面,我相信在足够寒冷的日子里,Marc Gravell可以小心翼翼地呼气,他的呼吸将以完美,冷淡的表情树代码的forms出现……