我有一个Lambda表达式,它是一个在之前的上下文中执行一些操作的函数。因此,我需要克隆这个对象,并将表达式传递到新的上下文中,但我担心新表达式中会携带局部值。我已经努力将参数接收到表达式中,并避免对象的局部值,因此希望将其保持在最小。然而,我的问题是,有没有可能克隆一个表达式,并让它的编译输出遵循新的对象局部值,而不是旧的?
我可以举例说明,如果图片这个词不够描述性。
我的基本假设是,在某种程度上,相同的Lambda表达式规则是有效的。也就是说,Lambda表达式如何识别表达式上下文的局部变量。
谢谢..。
发布于 2011-07-20 06:33:42
拉姆达表达式“规则”是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。还要注意,嵌套的作用域可能会导致涉及链式上下文对象的更复杂的场景。
就我个人而言,我怀疑你不需要担心这一点。
https://stackoverflow.com/questions/6754810
复制相似问题