C # клонирование, включая лямбда-выражения - PullRequest
2 голосов
/ 20 июля 2011

У меня есть лямбда-выражение, которое является функцией, которая выполняет некоторую операцию в предыдущем контексте.Следовательно, мне нужно будет клонировать этот объект и перенести выражение в новый контекст, но я обеспокоен тем, что в новое выражение будут перенесены локальные значения.Я приложил усилия, чтобы получить параметры в выражении и избежать локальных значений объекта, так что, надеюсь, это сведено к минимуму.Тем не менее, мой вопрос заключается в том, возможно ли клонировать выражение и сделать его скомпилированный вывод соответствующим новым локальным значениям объекта, а не старым?1003 *

Я действую исходя из базового предположения, что на каком-то уровне действуют те же правила лямбда-выражения.То есть, как лямбда-выражения распознают локальные переменные в контексте выражения.

Спасибо ...

1 Ответ

3 голосов
/ 20 июля 2011

Лямбда-выражение "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.Также обратите внимание, что вложенные области действия могут привести к более сложным сценариям, включающим связанные объекты контекста.

Лично;Я сомневаюсь, что вам нужно беспокоиться об этом.

...