7

我有一组具有相同签名的事件。现在我想知道是否可以创建一个通用事件处理程序引发方法来为所有事件执行此操作?

  • 这可以发送一个事件<T>吗?
4

3 回答 3

11

如果这都在一个类中,您可以创建一个方法来引发与它们中的任何一个一起使用的事件。例如,如果您的事件都是EventHandler<T>,您可以使用:

private void RaiseEvent<T>(EventHandler<T> eventHandler, T eventArgs)
{
    if (eventHandler != null)
    {
        eventHandler(this, eventArgs);
    } 
}

然后您可以通过以下方式调用它:

this.RaiseEvent(this.MyEvent, new MyEventArgs("Foo"));
于 2012-09-28T16:50:48.553 回答
2

对于 Reed Copsey 回复的静态版本,我创建了一个静态类Event

public static class Event
{
    public static bool Raise<T>(Object source, EventHandler<T> eventHandler, T eventArgs) where T : EventArgs
    {
        EventHandler<T> handler = eventHandler;
        if (handler != null)
        {
            handler(source, eventArgs);
            return true;
        }
        return false;
    }
}

这也假设您的事件处理程序属于EventHandler<T>. 返回类型从voidto更改为bool返回是否有任何事件的侦听器。很少使用,所以随时改回void.

示例用法:

public event EventHandler<FooArgs> FooHappend;

public void Foo()
{
    Event.Raise(this, FooHappend, new FooArgs("Hello World!");
}
于 2017-05-05T09:20:39.380 回答
-1

看到这个。它描述了你想要什么。

您可以通过使用类型化委托并将其用于您的事件来创建类型化事件:

public delegate void myDel<T>(T stuff);

public event myDel<int> myEvent;

public doStuff()
{
    myDel(1);
}
于 2012-09-28T16:44:48.557 回答