2009-09-02 97 views
0

我正在处理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 
} 

这样,我要注册我的用户一个由one.I认为这是一个样的工作,可以使用reflection.For例如,如果有一个类类型的控制器有一些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

您确定以“开”开头的任何方法是否合格? 我认为这是一个相当危险的假设。我建议为您想包含在反射搜索中的所有函数添加一个自定义属性。这有点多打字,但更安全。 – 2009-09-02 06:17:02

+0

@David:我知道这只是一个例子 – Beatles1692 2009-09-02 06:25:53

+1

可能的重复[如何使用反射调用泛型方法?](http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-泛型方法) – nawfal 2014-01-18 05:33:20

回答

0

我发现我的答案here

其实这似乎有一些MakeGenericXXX方法,帮助我们用反射泛型工作。

0

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

0

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

+0

我可以使用属性来查找我的事件处理程序方法,但我仍然有问题来订阅它们。实际上,我不知道如何在运行时调用EventRegistry的Subscribe方法 – Beatles1692 2009-09-02 06:24:46

相关问题