0

そのため、C#3.0を使用しており、特定の形式のイベントルーティングを実現しようとしています。

public class A
{ 
  public delegate void FooDel(string blah);
  public Event FooDel FooHandler;

  //...some code that eventually raises FooHandler event
}

public class B
{
  public A a = new A(); 

  //...some code that calls functions on "a" that might cause
  //FooHandler event to be raised
}

public class C
{
  private List<B> MyListofBs = new List<B>();

  //...code that causes instances of B to be added to the list
  //and calls functions on those B instances that might get A.FooHandler raised

  public Event A.FooDel FooHandler;
}

私が理解しようとしているのはA.FooHandler、Aのインスタンスのすべてのイベント発生を1つのイベントにルーティングする方法C.FooHandlerです。そのため、誰かが登録するC.FooHandlerと、リスト内のBのインスタンスに含まれるAのインスタンスのいずれかによって発生したイベントが実際に発生します。

どうすればこれを達成できますか?

4

2 に答える 2

1

あなたが提供したサンプルコードでは、あなたはあなたが望むことをすることができません。A内でプライベートにしたので、クラス外のコード(クラスを含む)からBのインスタンスへのアクセスを封鎖しています。ABC

に含まれるイベントをサブスクライブおよびサブスクライブ解除するために、Aインスタンス内のメソッドがインスタンスにアクセスできるように、C何らかの方法でインスタンスをパブリックにアクセス可能にする必要があります。BA


編集: Baがパブリックであると仮定すると、プライベートであるため、最も簡単なC.MyListofBs方法は、A内で必要なイベントをサブスクライブおよびサブスクライブ解除する独自のAdd/Removeメソッドを作成することです。

Action私はまた、はるかにクリーンなクラスを支持して、あなたの代理人を削除する自由を取りました。

public class A
{ 
    public Event Action<string> FooHandler;

    //...some code that eventually raises FooHandler event
}

public class B
{
    public A a = new A();

    //...some code that calls functions on "a" that might cause
    //FooHandler event to be raised
}

public class C
{
    private List<B> MyListofBs = new List<B>();

    //...code that causes instances of B to be added to the list
    //and calls functions on those B instances that might get A.FooHandler raised

    public void Add(B item)
    {
        MyListofBs.Add(item);
        item.a.FooHandler += EventAction;
    }

    public void Remove(B item)
    {
        item.a.FooHandler -= EventAction;
        MyListofBs.Remove(item);
    }

    private void EventAction(string s)
    {
        // This is invoked when "A.FooHandler" is raised for any 
        // item inside the MyListofBs collection.
    }
}

編集:そして、でリレーイベントが必要な場合は、次Cのようにします。

public class C
{
    private List<B> MyListofBs = new List<B>();

    public event Action<string> RelayEvent;

    //...code that causes instances of B to be added to the list
    //and calls functions on those B instances that might get A.FooHandler raised

    public void Add(B item)
    {
        MyListofBs.Add(item);
        item.a.FooHandler += EventAction;
    }

    public void Remove(B item)
    {
        item.a.FooHandler -= EventAction;
        MyListofBs.Remove(item);
    }

    private void EventAction(string s)
    {
        if(RelayEvent != null)
        {
            RelayEvent(s);
        }
    }
}
于 2013-03-21T19:09:22.977 に答える
0

B.foohandlerイベントを購読する

Foreach(var item in MyListofBs) 
{

      Item.fooHandler += new EventHandler(CEventHandler) 
}
   //each time your Events are called you reroute it with C.EventHandler 
Private CEventHandler(string blah) 
{    
    If(FooHanler!=null)
       FooHanler(); 
}

次のイベントチュートリアルの例を確認してください

于 2013-03-21T19:10:55.853 に答える