我有一个Lambda Expression,它是一个在前一个上下文中执行某些操作的函数。因此,我将需要克隆此对象并将表达式转移到新的上下文,但我担心将在新表达式中继承本地值。我已经努力在表达式中接收参数并避免使用对象本地值,因此希望将其保持在最低限度。但是,我的问题是,是否有可能克隆一个表达式并使其编译的输出符合新对象本地值而不是旧对象?
我可以说明这个单词图片是否不够具有描述性。
我在基本假设下运行,在某种程度上,相同的Lambda表达规则有效。也就是说,Lambda表达式如何识别表达式上下文中的局部变量。
谢谢...
答案 0 :(得分:3)
lambda表达式“rules”是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
。另请注意,嵌套作用域可能会导致涉及链接上下文对象的更复杂场景。
个人;我怀疑你需要担心这个。