我是System.Linq.Expresions中的新手,我正试图弄清楚这段代码有什么问题:
var mc = new MyClass();
ParameterExpression value = Expression.Parameter(typeof(object), "value");
ParameterExpression xParam = Expression.Parameter(typeof(MyClass), "x");
Expression<Func<MyClass, object>> e = x => x.Val;
BlockExpression block = Expression.Block(new[] { xParam, value },
Expression.Assign(e.Body, value));
Expression.Lambda<Action<MyClass, object>>(block, xParam, value).Compile()(mc, 5); //I'm getting exception here when Compile()
...
class MyClass
{
public object Val
{
get;
set;
}
public object OtherVal
{
get;
set;
}
}
我只想构建类似mc.Val = 5的东西,假设MyClass和object参数是lambda的参数(我不想使用闭包)
答案 0 :(得分:7)
e.Body
引用e
中的参数。但这是一个与xParam
不同的参数。这两个人的名字相同是不够的。它们必须是同一个对象。
理解你试图使用lambdas作为生成它们的工具来获取表达式。要使用该方法,您需要使用您控制的参数(e
)替换xParam
中的所有参数。你必须保持一致。