1

C# コードを介して、Control に設定されたメソッド/デリゲートのリストを取得することは可能ですか? もっと詳しく説明させてください..たとえば。

次のようないくつかの定義を仮定します。

foo.Click += (a, b) => { ... }
//..
foo.Click += (A,B) => { ... }

そして魔法の方法:

var baa = foo.GetEvents("Click");

戻り値

baa[0]に指差す(a, b) => { ... }

baa[1]に指差す(A,B) => { ... }

私の風景: ループ内のいくつかのコントロールに動的にイベントを作成して追加します。ブール値に応じて、インデックス 1 の制御のイベントを制御したいのですが、control.Click -= baa[1] などを使用して削除されます。これがあなたにとって明確であることを願っています。前もって感謝します。

4

1 に答える 1

2

いいえ、それを行う方法はありません。イベントの要点は、バッキング デリゲート フィールドを非表示にすることです (厳密に言えば、バッキング フィールドはまったく存在しない可能性があります)。これにより、イベントの購読または購読解除のみを行うことができます。

この理由は、サブスクライバー (オブザーバー パターンでは "オブザーバー" とも呼ばれます) は、他のサブスクライバーについて知る必要はなく、ましてやサブスクライブを解除することはできないためです。あなたの隣人があなたのお気に入りの雑誌の購読をキャンセルしたら、あなたは何と言いますか? ;)


編集:実際に、それを行う方法がありますが、それは醜く、信頼できません。クラスがイベント ハンドラー (通常はデリゲート フィールドですが、Windows フォームでは異なります) を格納する方法を知っていると仮定すると、プライベート メンバーのリフレクションを使用してイベント ハンドラーを取得できます。

于 2012-06-07T22:44:31.573 に答える