我有一组具有相同签名的事件。现在我想知道是否可以创建一个通用的事件处理程序来处理所有这些事件?
- 是否可以将事件作为
<T>
发送?
我有一组具有相同签名的事件。现在我想知道是否可以创建一个通用的事件处理程序来处理所有这些事件?
<T>
发送?如果这些都在同一个类中,你可以创建一个方法来触发事件并适用于任何事件。例如,如果你的事件都是EventHandler<T>
,你可以使用以下方法:
private void RaiseEvent<T>(EventHandler<T> eventHandler, T eventArgs)
{
if (eventHandler != null)
{
eventHandler(this, eventArgs);
}
}
您可以通过以下方式调用它:
this.RaiseEvent(this.MyEvent, new MyEventArgs("Foo"));
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!");
}
请查看this。它描述了你想要的内容。
您可以通过使用类型化委托并将其用于事件来创建一个类型化事件:
public delegate void myDel<T>(T stuff);
public event myDel<int> myEvent;
public doStuff()
{
myDel(1);
}
eventHandler
成为方法中使用的“局部变量”,因此您不会遇到竞争条件。 - Reed CopseyFunc<EventHandler<T>>
并使用 lambda 引发它,但在调用方面会变得更加丑陋。通常更容易在子类中重新执行此操作。 - Reed Copseyprivate void RaiseEvent<T>(EventHandler<T> eventHandler, T eventArgs) where T : EventArgs
- Vova