2013-03-21 7 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, они действительно получат события, вызванные любым из экземпляров A, содержащихся в экземплярах B в списке.

Как бы это осуществить?

ответ

1

С кодом, который вы предоставили, вы не можете делать то, что хотите. Поскольку вы сделали A частным в пределах B, вы закрываете доступ к экземпляру A из любого кода вне класса B (который включает в себя класс C).

Вы должны каким-то образом сделать свой A экземпляр публично доступен, так что методы в рамках C может получить к нему доступ через B для подписки и де-подписываться на события, содержащиеся в A.


Edit: Предполагая, что Ба была публичной, проще всего сделать, так как C.MyListofBs является частным, чтобы создать свой собственный Add/Remove методы, которые также подписываются и разрегистрировали подписаться на событие вы хотите в A, вот так.

Я также взял на себя ответственность за удаление вашего делегата в пользу гораздо более чистого класса 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. 
    } 
} 

Edit: И если вы хотите событие реле в 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

Хорошо, говорят, что «a» в B было публичным. – Ryan

+0

См. Мое редактирование выше. – qJake

+0

Но теперь нет никакого события в C, на который я могу подписаться, это моя цель. – Ryan

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

Куда бы это было сделано? Это происходит после того, как все Bs добавлены в список в C? Что такое EventHandler, где это определено? – Ryan

+0

Да, вы подписываетесь либо после создания списка, либо после того, как каждый элемент добавлен – makc

+0

Извините misread EventHandler, используйте это раньше. – Ryan

Смежные вопросы