【问题标题】:C# Cloning including Lambda ExpressionC# 克隆,包括 Lambda 表达式
【发布时间】:2011-07-19 22:20:14
【问题描述】:
我有一个 Lambda 表达式,它是一个在先前上下文中执行某些操作的函数。因此,我需要克隆这个对象并将表达式转移到新的上下文中,但我担心会有局部值转移到新的表达式中。我已经努力将参数接收到表达式中并避免对象局部值,因此希望将其保持在最低限度。但是,我的问题是,是否可以克隆一个表达式并使其编译后的输出尊重新的对象本地值而不是旧的?
如果那个单词图片描述性不够,我可以说明。
我在基本假设下操作,即在某种程度上,相同的 Lambda 表达式规则是有效的。也就是说,Lambda 表达式如何识别表达式上下文的局部变量。
谢谢...
【问题讨论】:
标签:
c#
lambda
expression
icloneable
【解决方案1】:
lambda 表达式“规则”是 c# 编译器(或您使用的任何语言)的一部分;表达式本身没有上下文的自动知识。相反,如果你“捕获”一个变量,即下面的x:
int x = ...
Expression<Func<Foo, bool>> predicate = obj => obj.Bar == x;
编译器创建一个生成的上下文类的实例,并使用ConstantExpression 将其与树关联:
// 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。另请注意,嵌套范围可能会导致涉及链接上下文对象的更复杂场景。
个人;我怀疑你需要担心这个。