如何将相同的方法分配给多个委托

How to assign the same method to multiple delegates

是否可以同时将同一个方法分配给多个委托?

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() 的赋值。

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

如果我们谈论的是一大堆事件,反思将是一种方式......但我不会真正称之为 "simplification"

编辑:

澄清:

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

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

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

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

关于"simplification":

您需要做的是:

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

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

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

因此,如果您不处理一大堆事件,比如几百个,那么像您所做的那样编写它似乎是更可取的方式……反射方法绝不会更简单或更短

有一种方法可以一次分配多个事件处理程序,不需要反射,但这并不简单,需要一些编程。如果你想在循环中初始化事件,你可以使用字典来存储你的事件。

附带说明:按照惯例,只有在委托类型为 EventHandler 时才应使用 event 关键字。当其他人尝试使用它时,它可能并且很可能会使其他人感到困惑。

Hoge class:

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