2011-07-19 7 views
2

ラムダ式は、前のコンテキストで何らかの操作を行う関数です。したがって、私はこのオブジェクトをクローンし、新しい文脈にその表現を引き継ぐ必要がありますが、新しい表現に局所的価値が引き継がれることに懸念しています。私は、式にパラメータを受け取り、オブジェクトのローカル値を避けるように努力しました。だから、これが最小限に抑えられればうれしいです。しかし、私の質問は、式を複製し、そのコンパイルされた出力に古いオブジェクトではなく新しいオブジェクトのローカル値を使用させることができるかどうかです。ラムダ式を含むクローニング

私は、その単語の絵が十分に説明的ではなかったかどうかを説明することができます。

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

は、ラムダ式「ルール」は、C#コンパイラの一部(またはものは何でも使用している言語)です...

+0

いくつかのコードを追加すると助けになります... –

+0

コンテキスト(疑似コードはおそらく?)が本当に役立つでしょう。 –

答えて

3

をいただき、ありがとうございます。 Expression自体にはコンテキストの自動知識がありません。あなたは以下すなわち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を介して書き換えることです。また、ネストされたスコープは、チェーンコンテキストオブジェクトを含むより複雑なシナリオにつながる可能性があることにも注意してください。

個人的に;私はあなたがこれについて心配する必要があるとは思わない。