我有一个简单的lambda表达式,我想编译并调用
Expression< Func< Commands, bool>> expression = c => c.IsValid("test");
但是当我执行以下操作时:
LambdaExpression le = Expression.Lambda(expression.Body);
object result = le.Compile().DynamicInvoke();
编译抛出错误:
从范围''引用的'ConsoleApplication1.Commands'类型的变量'c',但未定义
如何为此表达式设置实例变量?
答案 0 :(得分:4)
为什么不直接编译表达式呢?如果您想多次使用某些特定的“ConsoleApplication1.Commands”实例调用它,则可以关闭该实例:
var validator = expression.Compile();
var c = new Commands();
var validatorForC = () => validator(c);
否则你需要构建一个调用表达式,如下所示:
var c = new Commands();
var le = Expression.Lambda(Expression.Invoke(expression, Expression.Constant(c)));
object result = le.Compile().DynamicInvoke();
或者你可以制作ExpressionVisitor,用Expression.Constant替换'expression.Body'中'c'参数的所有出现。