LAMBDA参数不在范围内 - 在构建二元lambda表达式(Lambda Parameter no

2019-08-18 14:27发布

当手工创建一个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

}

Answer 1:

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

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

它应该是:

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

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

如果它的任何安慰可言,我很少得到纯手工打造的表达式树正确的第一次。 我不得不对他们发誓一会儿。 在另一方面,我认为,在足够寒冷的日子里,马克Gravell可以仔细呼气,他的呼吸将在完美的,冷冰冰的表达式目录树代码的形式出来...



文章来源: Lambda Parameter not in scope — while building binary lambda expression