如何创建通用事件提升方法

时间:2012-09-28 16:42:38

标签: c# asp.net events generics event-handling

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

  • 是否可以将活动发送为<T>

3 个答案:

答案 0 :(得分: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"));

答案 1 :(得分: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>类型。返回类型已从void更改为bool,并返回是否有任何侦听器。很少使用,所以可以随意改回void

使用示例:

public event EventHandler<FooArgs> FooHappend;

public void Foo()
{
    Event.Raise(this, FooHappend, new FooArgs("Hello World!");
}

答案 2 :(得分:-1)

this。它描述了你想要的东西。

您可以使用类型化的委托创建一个类型化的事件,并将其用于您的事件:

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

public event myDel<int> myEvent;

public doStuff()
{
    myDel(1);
}