我有一个简单的 lambda 表达式,我想编译和调用它
Expression< Func< Commands, bool>> expression = c => c.IsValid("test");
但是当我执行以下操作时:
LambdaExpression le = Expression.Lambda(expression.Body);
object result = le.Compile().DynamicInvoke();
编译抛出错误:
从范围“”引用了“ConsoleApplication1.Commands”类型的变量“c”,但未定义
如何设置该表达式的实例变量?
为什么不直接编译表达式本身呢?如果您想使用某些特定的“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”参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)