2011-07-13 11 views
2

私はクラスXを持っており、このクラスはイベントを持っています:EventX。イベントハンドラをチェックする方法は登録されています

そして、私はクラスBを持っているが、私はobjectXのEventXをチェックする方法

X objectX = X.GetStaticObject(); 
objectX.EventX += HandlerB; 

クラスBののEventHandler HandlerBにobjectXのイベントEventXを登録するのEventHandler HandlerBを含んでいました。ありがとう。

注意:それが空であるかもしれないけれども objectXは(それがnullでない場合、それが登録されているB.

答えて

4

HandlerBが登録されていることを確認するには、Delegate.GetInvocationList()メソッドを使用して適切な情報を取得できます。

EDIT:

V4Vendettaのコメントの後、私はコードをコンパイルしようとしましたが、それが失敗しました。私は少しそれを変更しました。

はそのチェックを行うことができるようにするには、メソッドのテストは、(私がそうでない代わりに、Xのこれを使用し、それは静的だと仮定)Xに追加する必要があります。

public static void Test(Delegate delegateToTest) 
{ 
    if (X.EventX != null) 
    { 
     foreach (Delegate existingHandler in X.EventX.GetInvocationList()) 
     { 
      if (existingHandler == delegateToTest) 
      { 
       // registered 
      } 
     } 
    } 
} 

そしてHandlerBがアクセス可能で、どこかからテスト:あなたが同じイベントのために二回登録するイベントハンドラを防ぎたい場合は、それを登録する前に

X.Test(new EventHandler(HandlerB)); 
+1

イベントでこれを行うことはできますか? – V4Vendetta

+0

@ V4Vendetta:そうです。私はVSでそれをチェックしなかったし、それがエラーを引き起こすかもしれないことを完全に忘れる。しかし、私はそれを動作させるためにコードを編集しました。 – msergey

3

オブジェクトされていないオブジェクトをどこからでも登録することができるイベント静的グローバルでありますハンドラ)。私の知る限りでは

if(objectX.EventX != null) 
{ 
    // registered! 
} 

、あなたはそれに登録されているものを伝えることはできません。最初の場所にイベントを持っている点を打ち破ることができること(デコーディングコードとダブルディスパッチ)。

+0

ただし、objectXはグローバルオブジェクト(静的)であるため、どこからでも登録できます。ありがとう。 –

+0

私は詳細を追加します。私を助けてください。ありがとう。 –

0

、あなたはそれを削除することができ - 何かを次のように:

objectX.EventX -= HandlerB; 
objectX.EventX += HandlerB; 

これは登録コードで、またはイベント自体でも行うことができます。詳細はthis questionをご覧ください。

注::以前に登録されていなくても、HandlerBを削除してはいけません! (誰かが明示的なイベント定義のremove部分を変更して明示的なイベント定義を変更しない限り)

関連する問題