我在用着System.Linq.Expressions
我试图建立一个简单的Lambda表达式其中包括一个会员表达。如果我使用 System.Linq.Expressions API 显式创建 MemberExpression(例如建立会员访问权限),当我在 LambdaExpression 上调用 Compile() 时,我会收到错误“InvalidOperationExpression 变量 'x' 从作用域 '' 引用,但未定义”。
例如,这是我的代码
Expression<Func<Customer, string>> expression1, expression2, expression3;
Func<Customer, string> fn;
expression1 = (x) => x.Title;
fn = expression1.Compile();//works
fn(c);
MemberExpression m;
m = Expression.MakeMemberAccess(
Expression.Parameter(typeof(Customer), "x"), typeof(Customer).GetProperty("Title"));
expression2 = Expression.Lambda<Func<Customer, string>>(m,
Expression.Parameter(typeof(Customer), "x"));
m = Expression.Property(Expression.Parameter(typeof(Customer),"x"), "Title");
expression3 = Expression.Lambda<Func<Customer, string>>(m,
Expression.Parameter(typeof(Customer), "x"));
fn = expression3.Compile();//InvalidOperationExpression variable 'x' referenced from scope '', but it is not defined
fn = expression2.Compile();//InvalidOperationExpression variable 'x' referenced from scope '', but it is not defined
调用 Compile() 方法时,表达式 2 和表达式 3 会抛出异常,但表达式 1 不会;表达式1有效。为什么是这样?如何创建像表达式 2、3 中那样的 MemberExpression,并在调用 Compile() 时让它们工作(不抛出异常)?
Thanks