LambdaExpression变量引用范围但未定义

时间:2011-10-11 21:30:06

标签: c# expression-trees

我有一个简单的lambda表达式,我想编译并调用

Expression< Func< Commands, bool>> expression = c => c.IsValid("test");

但是当我执行以下操作时:

LambdaExpression le = Expression.Lambda(expression.Body);

object result = le.Compile().DynamicInvoke();

编译抛出错误:

  从范围''引用的'ConsoleApplication1.Commands'类型的变量'c',但未定义

如何为此表达式设置实例变量?

1 个答案:

答案 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'参数的所有出现。