2009-09-02 141 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

相關問題