我试图在c#中动态分配事件处理程序。为此,我正在寻找一个解决方案来获取一个事件的所有订阅者,而不知道确切的类型(因为我有抛出事件的类的通用托管逻辑)。
总的来说,我有以下设置(简化为事件部分)。有一个基类,提供了一个函数来提供所有事件的所有处理程序:
class BaseClass {
public System.Delegate[] getHandlers(EventHandler GenericEvent) {
return GenericEvent.GetInvocationList();
}
}
然后以下列方式派生(多次)此Basic类:
class DerivedClassOne : BaseClass {
public event EventHandler<CustomEventArgsClass1> CustomClassOneEvent;
[...]
}
class DerivedClassTwo : BaseClass {
public event EventHandler<CustomEventArgsClass2> CustomClassTwoEvent;
[...]
}
现在,我想让所有处理程序在一个或两个类型的对象中处理事件。使用以下代码,我可以获得所有事件类型/信息:
DerivedClassOne c1 = new DerivedClassOne();
BindingFlags myBindingFlags = BindingFlags.Instance | BindingFlags.Public;
Type myTypeEvent = c1.GetType();
EventInfo[] myEventsBindingFlags = myTypeEvent.GetEvents(myBindingFlags);
现在,使用event.GetInvocationList(),我可以获取事件的所有处理程序 - 至少在派生类中:
System.Delegate[] handler = CustomClassOneEvent.GetInvocationList();
我想要实现的是在基类中有一个例程来为事件类型提供处理程序,如下所示:
public System.Delegate[] getHandlers(EventHandler GenericEvent) {
return GenericEvent.GetInvocationList();
}
所以,有两个主要问题: