0

匿名メソッド構文 ( ) を使用して、メソッドをデリゲート D にチェーンする必要がある状況がありますD += delegate(...){}。ただし、新しいメソッドを追加する前に、チェーンされた他のメソッドが削除されていることを確認する必要があります。

D -= a, D += b のようなことができることはわかっていますが、匿名メソッドを使用しているため、それが機能するかどうかはわかり-=ません (明示的な名前がないため)。

私の推論が正しければ、匿名構文を使用してチェーンされたすべてのメソッドを削除する方法はありますか?

前もって感謝します。

4

2 に答える 2

2

それはとても間違っていて、コメント(質問と私の答えの両方の下で)がいくつかの追加情報を提供したので、私は元の答えを撤回しなければなりませんでした。

イベントとデリゲートの両方で、null(または新しいリスナー)を割り当てる=だけで、他のすべてのリスナーを取り除くことができますが、イベント/デリゲートが定義されているのと同じクラスでのみ可能です。

同じクラスで宣言されていないイベントからすべてのリスナーを削除することは通常の方法では不可能であることがわかりましたが、イベント/デリゲートを見つけてnullを割り当てることでReflectionを使用して削除できますFieldInfo.SetValue

これは、以前のSOの質問へのリンクです。これは、あなたと同様の制約があった可能性があります。この特定の答えは私のために働いた: https ://stackoverflow.com/a/8108103/1659828

于 2012-11-23T13:44:51.867 に答える
0

デリゲート型は不変型です。がデリゲート型のインスタンスである場合、 1つ以上の項目Dを持つ固定長の呼び出しリストで構成されます。

したがって、リストを「クリア」することはできません。nullメソッドが存在しない場合には参照 (インスタンスではない) が使用されるため、空の呼び出しリストで新しいインスタンスを作成することもできません。

例 (MyMethodJonnysMethodはメソッド グループであり、デリゲート変数ではありません):

Action D = null;   // no object, no invocation list

D += MyMethod;     // null and new Action(MyMethod) are combined; result is assigned to D
// D is an instance, invocation list length is 1
D += JonnysMethod; // two instances are combined; D is assigned to new instance; original instances are no longer referenced and will "soon" be garbage collected
// D is an instance, invocation list length is 2

D -= MyMethod;     // D is assigned to a new instance again
D -= JonnysMethod; // D is assigned to null; no new instance

注意:Dが本当にイベントである場合は、注意してください。Dが定義され+=ているクラス/構造体の外-=にいて、イベントのアクセサーを呼び出している場合。したがって、この場合、それらは即時のデリゲートの組み合わせではありません。を定義するクラス/構造体の内部にいる場合D、およびDが「フィールドのような」イベントでDある場合、2 つの意味で使用できます。デリゲート変数 (イベントの「隠し」バッキング フィールド) として、およびイベントとして。+=andの意味は-=、2 つの方法で解釈できます。C# 3 までは、バッキング フィールドで直接デリゲートの組み合わせとして解釈されていました。C# 4 および C# 5 では、セマンティックが変更され+=-=この状況でイベント アクセサーが呼び出されます。

于 2012-11-25T09:06:22.310 に答える