4


1

イベントインスタンスのすべてのハンドラー(デリゲート)を同じイベントタイプの別のイベントインスタンスに追加する方法は?

AとBの2つのクラスがあります。 クラスAには、イベントEventAがあります

public delegate void FolderStructureChangedHandler();
public event FolderStructureChangedHandler EventA;

クラスBには、EventBという名前の同じイベントがあります。 アプリケーションのメソッドで、EventAに登録されているすべてのハンドラーをEventEventBに追加したい

A classA = new classA();
classA.EventA += delegate1();
classA.EventA += delegate2();

B classB = new classB();
classB.EventB += classA.EventA;

これにより、「…​イベント 'EventA’は+ =または-= …​の左側にのみ表示されます」というエラーが発生します。 作り方がわかりません。

EventAのすべてのハンドラーを列挙する方法を考え出しましたが、その方法がわかりません。 助けてください。

2 Answer


4


クラスの内部からのみ、イベントのInvocationListにアクセスできます。

したがって、ソリューションは次のようになります。

class A
{
   public event FolderStructureChangedHandler EventA;

   public void CopyHandlers(B b)
   {
       var handlers = EventA.GetInvocationList();
            foreach (var h in handlers)
            {

                b.EventB += (EventHandler) h;
            }
   }
}

しかし、それはきれいではありません。


2


イベントはプロパティに少し似ています:プロパティにはバッキングフィールドがあり、アクセサを取得/設定します。 自動プロパティを使用すると、バッキングフィールドにアクセスできません。

同様に、イベントには補助フィールドと追加/削除アクセサがあります。 何も指定しない場合、自動的に作成されます。 クラスAでバッキングフィールドを作成し、クラスBでthiatデータを使用してみてください。 このようなバッキングフィールドについては、http://msdn.microsoft.com/en-us/library/8627sbea(VS.71).aspxの例2を参照してください。