如何在运行时添加通用事件处理程序

时间:2009-09-02 06:14:22

标签: c# generics event-handling

我正在开发一个EventRegistry,可以注册一些事件处理程序。每次引发事件时,它都会检查该事件是否有任何订阅者并调用它们。

interface IEventRegistry
{
void Subscribe<TEventArgs>(Type eventType,EventHandler<TEventArgs> subscriber) where TEventArgs:EventArgs
void Publish<TEventArgs>(Type eventType,object sender,TEventArgs args) where TEventArgs:EventArgs
}

这样我就可以逐个注册我的订阅者了。我认为这是一种可以使用反射自动化的工作。例如,如果有一类Controller类型有一些OnXXX方法,我想订阅它们自动:

foreach(var type in assembly.GetTypes())
{
if((typeof(Controller).IsAssginableFrom(type))
foreach(var methodInfo in type.GetMethods())
{
if(methodInfo.Name.StartsWith("On"))
     // Subscribe method
}

问题是,由于我使用泛型方法来订阅事件处理程序,如何在运行时使用给定类型调用它? 实际上我不知道如何在运行时通过反射给出一些输入来调用EventRegistry的Subscribe方法。

3 个答案:

答案 0 :(得分:0)

使用Type.InvokeMember调用实例上的方法。或者,如果您担心性能,请缓存一组指向您需要调用的过程的代理。

答案 1 :(得分:0)

我认为最好的方法是使用自定义属性,因为那时你可以在运行时查找具有特定属性的方法。

答案 2 :(得分:0)

我找到了答案here

实际上似乎有一些MakeGenericXXX方法可以帮助我们使用反射来处理泛型。