2011-10-02 88 views
3

所以我有一個班,基本上是一個經理20 +副本的另一類。處理每個人發起的同一事件的最佳方式是什麼?這是註銷事件的最佳方式嗎?或者我應該以某種方式使用一個EventHandler?最好的方法來處理多個類的事件?

我把一個簡單的例子,基本上做我在做我的實際項目。

class Manager 
{ 
    List<Child> children = new List<Child>(); 

    public Manager() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      Childchild = new Child(); 
      child.Done += child_Done; 
      items.Add(child); 
      child.DoStuff(); 
     } 
    } 

    public void RemoveAll() 
    { 
     foreach (Child child in items) 
     { 
      child.Done -= child_Done; 
     } 
     items.Clear(); 
    } 

    void child_Done(string sometext) 
    { 
     Console.WriteLine("child done: " + sometext); 
    } 
} 

class Child 
{ 
    public delegate void _Done(string sometext); 
    public event _Done Done; 

    public Child() 
    { 

    } 

    public void DoStuff() 
    { 
     if (Done != null) { Done("finally!"); } 
    } 
} 

回答

1

註銷應該沒問題 - 只要目標實例和方法匹配它就可以工作。然而,我會強烈建議您使用更常規的事件模式,並使用sender - 那麼您將知道哪個孩子正在說話。例如:

public class MessageEventArgs : EventArgs { 
    public MessageEventArgs(string message) { 
     this.message = message; 
    } 
    private readonly string message; 
    public string Message { get { return message; } } 
} 

和:

public event EventHandler<MessageEventArgs> Done; 
protected virtual void OnDone(string message) { 
    var handler = Done; 
    if(handler != null) handler(this, new MessageEventArgs(message)); 
} 
1

假設你想這可能是更好的添加管理對象到每個孩子對當子對象引發事件:

添加一個孩子時,它可能會更好的註冊事件並在取出孩子時取消註冊。

一個快速的方法是從列表切換到ObservableCollection。一旦收藏發生變化,此收藏品將立即舉辦活動。

因此,在管理器的構造函數中,實例化ObservableCollection並註冊CollectionChanged事件。在處理程序中檢查事件參數,以查看添加了哪些子項並將其刪除,以便管理員可以註冊(或取消註冊)其事件。

1

這是或多或少的方式。
一些建議,使工作更好一點:

  1. 創建功能,增加了一個孩子,並以同樣的方式登記該事件。
    刪除子項+取消註冊事件也可以做到這一點。
  2. 此外,您可以讓事件獲得「發件人」參數,並讓該子對其傳遞「this」。 通過這種方式,事件處理程序將能夠知道哪個孩子已完成,並將其從列表中移除,和/或需要完成的任何其他事項。
相關問題