8

手動でラムダ式を作成すると、「パラメーターが範囲外」という例外が発生します。

私が間違っていることについてのアイデアはありますか?

 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

}
4

1 に答える 1

12

同じパラメーター オブジェクトを再利用する必要があります。だからあなたが持っているところ:

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

そのはず:

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

それらが名前で一致することは理にかなっていますが、それは機能する方法ではありません:(

少しでも慰めになるとすれば、私は手作業で式ツリーを最初から正しく作成することはめったにありません。私はしばらく彼らに誓わなければなりません。一方、十分に寒い日には、Marc Gravell は慎重に息を吐き出すことができ、彼の息は完璧で冷ややかな表現ツリー コードの形で出てくると思います...

于 2009-10-15T19:16:23.993 に答える