如何为多个代理分配相同的方法

时间:2015-01-05 06:01:18

标签: c# events delegates action eventhandler

是否可以同时为多个代理分配相同的方法?

public class Hoge
{        
    public event Action EventA;
    public event Action EventB;
    public event Action EventC;

    public Hoge()
    {
        EventA += () => FugaMethod();
        EventB += () => FugaMethod();
        EventC += () => FugaMethod();
    }

    private void FugaMethod()
    {
        Console.WriteLine("Hello.");
    }

}

我想简化FugaMethod()的分配。

2 个答案:

答案 0 :(得分:2)

因为事件不能作为参数......不幸的是......没有

如果我们谈论的是大量的事件,那么反思将是要走的路......但我并没有真正称之为"简化"

编辑:

澄清:

您可以作为参数传递的内容:

附加到特定对象上的静态或特定事件的事件处理程序的当前列表(在这种情况下传递的不是事件,而是MulticastDelegate

你不能作为参数传递的内容:事件本身......

您无法以直接的方式传递事件以允许附加另一个事件处理程序...因为您可能希望传递特定的obect实例,EventInfo描述事件本身,和新的处理程序......

关于"简化":

你需要做的是:

- 使用反射来获取所需事件的EventInfo个对象 - 为每个实例和每个EventInfo调用EventInfo.AddEventHandler,将实例作为目标传递,将eventhandler作为处理程序传递

因为您无法将事件作为参数传递,所以无法提取简单且类型安全的方法来获取所需的EventInfo对象。您将不得不按名称使用某些选择,或使用Type.getEvent或Type.getEvents

将实例类型分开的其他逻辑

所以,如果你没有处理大量的事件,比如几百个,那么像你一样写它似乎是最好的方式......反射方法将更简单或更短

答案 1 :(得分:0)

有一种方法可以同时分配多个不需要反射的事件处理程序,但这并不重要,而且需要进行一些编程。如果要在循环中初始化事件,可以使用字典存储事件。

作为旁注:根据惯例,只有在委托类型为event时才应使用EventHandler关键字。当他们试图使用它时,它可能会并且可能会混淆其他人。

Hoge上课:

public class Hoge
{
    // A dictionary to store your events.
    private Dictionary<string, EventHandler> events = new Dictionary<string, EventHandler>()
    {
        { "EventA", null },
        { "EventB", null },
        { "EventC", null }
    };

    // Event add/remove accessors.
    public event EventHandler EventA
    {
        add
        {
            lock (events)
            {
                events["EventA"] += (EventHandler)events["EventA"] + value;
            }
        }
        remove
        {
            lock (events)
            {
                events["EventA"] += (EventHandler)events["EventA"] - value;
            }
        }
    }

    // You can do the same for other events.
    public event EventHandler EventB;
    public event EventHandler EventC;

    public Hoge()
    {
        // Initialize events in a loop.
        foreach (var key in events.Keys.ToList())
        {
            events[key] += FugaMethod;
        }
    }

    // Raises EventA.
    public void RaiseEventA()
    {
        EventHandler handler;
        if (null != (handler = (EventHandler)events["EventA"]))
        {
            handler(this, EventArgs.Empty);
        }
    }

    // Event handler.
    private void FugaMethod(object sender, EventArgs e)
    {
        Console.WriteLine("Hello.");
    }
}

用法:

class Program
{
    static void Main(string[] args)
    {
        new Hoge().RaiseEventA();
    }
}

How to: Use a Dictionary to Store Event Instances (C# Programming Guide)

Handling and Raising Events