手动创建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
}
答案 0 :(得分:11)
您需要重用相同的参数对象。所以你得到了:
MemberExpression left = Expression.Property
(Expression.Parameter(typeof(OtherType), "para"), property);
它应该是:
MemberExpression left = Expression.Property(para, property);
我知道按名称匹配是有意义的,但这不是它的工作方式:(
如果有任何安慰,我很少第一次获得手工制作的表达树。我必须向他们发誓一段时间。另一方面,我相信在足够寒冷的日子里,Marc Gravell可以小心翼翼地呼气,他的呼吸将以完美,冷淡的表情树代码的形式出现......