【发布时间】:2012-09-20 13:53:31
【问题描述】:
我有一组具有相同签名的事件。现在我想知道是否可以创建一个通用事件处理程序引发方法来为所有事件执行此操作?
- 是否可以以
<T>发送事件?
【问题讨论】:
标签: c# asp.net events generics event-handling
我有一组具有相同签名的事件。现在我想知道是否可以创建一个通用事件处理程序引发方法来为所有事件执行此操作?
<T> 发送事件?【问题讨论】:
标签: c# asp.net events generics event-handling
如果这一切都在一个类中,您可以创建一个方法来引发与它们中的任何一个一起使用的事件。例如,如果您的事件都是EventHandler<T>,您可以使用:
private void RaiseEvent<T>(EventHandler<T> eventHandler, T eventArgs)
{
if (eventHandler != null)
{
eventHandler(this, eventArgs);
}
}
然后您可以通过以下方式调用它:
this.RaiseEvent(this.MyEvent, new MyEventArgs("Foo"));
【讨论】:
eventHandler 成为方法中使用的“局部变量”,因此您没有竞争条件。
Func<EventHandler<T>> 并使用一个 lambda 来提升它,但是在调用端它会变得有点丑陋。在子类中重做这个通常更容易。
对于 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!");
}
【讨论】: