从范围引用但未定义的 LambdaExpression 变量

发布于 2024-12-09 05:22:27 字数 429 浏览 0 评论 0原文

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

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

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

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

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

编译会抛出错误:

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

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

I have a simple lambda expression that I would like to compile and invoke

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

but when I do the following:

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

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

the compile throws the error:

variable 'c' of type 'ConsoleApplication1.Commands' referenced from scope '', but it is not defined

How do you set the instance variable for this expression?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吹泡泡o 2024-12-16 05:22:27

为什么不直接编译表达式本身呢?如果您想使用某些特定的“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.Body”中“c”参数与 Expression.Constant 一起出现。

Why not just compile the expression itself? If you'd like to invoke it with some specific 'ConsoleApplication1.Commands' instance multiple times you could then just close over that instance:


var validator = expression.Compile();

var c = new Commands();
var validatorForC = () => validator(c);

Otherwise you'll need to build call expression, like this:


var c = new Commands();
var le = Expression.Lambda(Expression.Invoke(expression, Expression.Constant(c)));
object result = le.Compile().DynamicInvoke();

or you can make ExpressionVisitor which will replace all occurences of the 'c' parameter in 'expression.Body' with Expression.Constant.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文