【问题标题】:Lambda Parameter not in scope -- while building binary lambda expressionLambda 参数不在范围内——在构建二进制 lambda 表达式时
【发布时间】:2009-10-15 19:12:36
【问题描述】:

手动创建 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

}

【问题讨论】:

    标签: c# lambda expression-trees


    【解决方案1】:

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

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

    应该是:

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

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

    如果有什么安慰的话,我很少第一次就得到手工构建的表达式树。我得对他们发誓一会儿。另一方面,我相信在足够冷的日子里,Marc Gravell 可以小心地呼气,他的气息会以完美、冷酷的表情树代码的形式出来……

    【讨论】:

    • 我不得不重读了十几遍才最终意识到出了什么问题。谢谢乔恩:D
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多