2011-10-02 74 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”。 通过这种方式,事件处理程序将能够知道哪个孩子已完成,并将其从列表中移除,和/或需要完成的任何其他事项。