首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >包含Lambda表达的C#克隆

包含Lambda表达的C#克隆
EN

Stack Overflow用户
提问于 2011-07-20 06:20:15
回答 1查看 1.1K关注 0票数 2

我有一个Lambda表达式,它是一个在之前的上下文中执行一些操作的函数。因此,我需要克隆这个对象,并将表达式传递到新的上下文中,但我担心新表达式中会携带局部值。我已经努力将参数接收到表达式中,并避免对象的局部值,因此希望将其保持在最小。然而,我的问题是,有没有可能克隆一个表达式,并让它的编译输出遵循新的对象局部值,而不是旧的?

我可以举例说明,如果图片这个词不够描述性。

我的基本假设是,在某种程度上,相同的Lambda表达式规则是有效的。也就是说,Lambda表达式如何识别表达式上下文的局部变量。

谢谢..。

EN

回答 1

Stack Overflow用户

发布于 2011-07-20 06:33:42

拉姆达表达式“规则”是c#编译器(或您正在使用的任何语言)的一部分;表达式本身并不自动了解上下文。相反,如果您“捕获”一个变量,例如下面的x

代码语言:javascript
运行
复制
int x = ...
Expression<Func<Foo, bool>> predicate = obj => obj.Bar == x;

编译器创建一个生成的上下文类的实例,并使用ConstantExpression将其与树相关联:

代码语言:javascript
运行
复制
// approximate representative code; not literal translation
var ctx = new SomeContext();
ctx.x = ... // x is actually a public instance field of SomeContext
var param = Expression.Parameter(typeof(Foo), "obj");
var predicate = Expression.Lambda<Func<Foo, bool>>(
     Expression.Equal(
        Expression.PropertyOrField(param, "Bar"),
        Expression.PropertyOrField(Expression.Constant(ctx), "x")
    ), param);

“交换”上下文实例的唯一方法是重写整个表达式,通常是通过ExpressionVisitor。还要注意,嵌套的作用域可能会导致涉及链式上下文对象的更复杂的场景。

就我个人而言,我怀疑你不需要担心这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6754810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档