c#克隆,包括Lambda表达式



我有一个Lambda表达式,它是一个函数,在以前的上下文中做一些操作。因此,我需要克隆这个对象并将表达式传递到新的上下文中,但是我担心会有局部值传递到新的表达式中。我已经努力将参数接收到表达式中,并避免对象局部值,因此希望将其保持在最低限度。然而,我的问题是,是否有可能克隆一个表达式,并使其编译输出尊重新的对象局部值,而不是旧的?

如果那张图片不够生动,我可以举例说明。

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

谢谢…

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。还要注意,嵌套作用域可能导致涉及链接上下文对象的更复杂的场景。

个人;我想你没必要担心这个

相关内容

  • 没有找到相关文章

最新更新