2013-03-21 57 views
0

因此,我使用C#3.0,並試圖完成一些特定形式的事件路由。C#通過一個事件從多個對象路由事件

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事件點火到一個事件C.FooHandler。因此,如果有人註冊到C.FooHandler,他們確實會收到列表中B實例包含的A的任何實例引發的事件。

我該如何做到這一點?

回答

1

用你提供的示例代碼,你不能做你想做的。由於您在B內製作了A私密文件,因此您將從B類(其中包括C類)之外的任何代碼中禁止訪問A實例。

你必須以某種方式讓你A實例公開訪問,使內C方法可以以訂閱和取消訂閱包含在A事件通過B訪問它。


編輯:假設巴是公開的,最容易做的事情,因爲C.MyListofBs是私有的,是創建自己的添加/刪除這也訂閱和方法去訂閱您想內的情況下,像這樣。

我還冒昧地將您的代表轉移到更清潔的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); 
     } 
    } 
} 
+0

好的說B中的「a」是公開的。 – Ryan 2013-03-21 19:11:24

+0

看到我上面的編輯。 – qJake 2013-03-21 19:17:09

+0

但是現在C中沒有任何事件可以訂閱,這是我的目標。 – Ryan 2013-03-21 19:29:36

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(); 
} 

走了過來以下示例Events Tutorial

+0

這個foreach去哪裏?所有的B被添加到C中的列表後,會發生這種情況嗎?什麼是EventHandler,定義在哪裏? – Ryan 2013-03-21 19:18:57

+0

是的,你是在所有的列表創建完畢後或者每個項目被添加後訂閱的。 – makc 2013-03-21 19:26:53

+0

對不起,誤讀了EventHandler,之前使用過。 – Ryan 2013-03-21 19:40:48