2

以前のコンテキストで何らかの操作を行う関数であるラムダ式を取得しました。したがって、このオブジェクトのクローンを作成し、式を新しいコンテキストに引き継ぐ必要がありますが、ローカル値が新しい式に引き継がれるのではないかと懸念しています。式にパラメーターを受け取り、オブジェクトのローカル値を避けるように努力したので、これが最小限に抑えられることを願っています。ただし、私の質問は、式を複製して、そのコンパイル済み出力に古いオブジェクトではなく新しいオブジェクトのローカル値を反映させることは可能ですか?

その言葉の絵が十分に説明的でなかったかどうかを説明できます。

私は、あるレベルで同じラムダ式ルールが有効であるという基本的な仮定の下で操作しています。つまり、ラムダ式が式のコンテキストに対してローカル変数を認識する方法です。

ありがとうございました...

4

1 に答える 1

3

ラムダ式の「ルール」は、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. また、ネストされたスコープは、チェーンされたコンテキスト オブジェクトを含む、より複雑なシナリオにつながる可能性があることに注意してください。

個人的に; これについて心配する必要はないと思います。

于 2011-07-19T22:33:42.453 に答える