处理多个类事件的最佳方法?

时间:2011-10-02 08:41:07

标签: c# events

所以我有一个班级基本上是另一个班级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!"); }
    }
}

3 个答案:

答案 0 :(得分:1)

假设您想要在子对象引发事件时添加Manager对象以响应每个子对象可能更好:

最好在添加孩子时注册该事件,并在删除孩子时取消注册。

快速执行此操作的方法是从List切换到ObservableCollection。该集合将在集合更改后立即引发事件。

因此,在Manager的构造函数中,实例化ObservableCollection并注册CollectionChanged事件。在处理程序中检查事件参数以查看已添加的子项,并将其删除,以便管理员可以注册(或取消注册)其事件。

答案 1 :(得分:1)

取消注册应该没问题 - 只要目标实例和方法匹配就可以了。但是,我强烈建议您使用更常规的事件模式,sender - 然后您将知道哪个孩子在说话。例如:

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

和a:

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

答案 2 :(得分:1)

这或多或少都是这样的 一些建议让它更好一点:

  1. 创建一个添加Child的函数,并以相同的方式注册该事件。
    删除子项+取消注册事件也可以这样做。
  2. 此外,您可以使事件获得“sender”参数,并使Child将“this”传递给它。 这样,事件处理程序将能够知道哪个子项已完成,并将其从列表中删除,和/或需要执行的任何其他操作。