2009-09-02 9 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ずつが、それは私がしたいいくつかのXXXのメソッドを持っているタイプのコントローラのクラスがあるかどうreflection.For例を用いて自動化することができる仕事のようなものだと思いますそれらを自動的に購読したい:

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

"On"で始まるメソッドはどれですか? これはかなり危険な前提だと思います。反射検索に含めるすべての関数にカスタム属性を追加することをおすすめします。これはもう少しタイピングですが、もっと安全です。 –

+0

@David:私はそれが単なる例であることを知っています – Beatles1692

+1

の可能な複製[一般的なメソッドを呼び出すためにリフレクションを使う方法?](http://stackoverflow.com/questions/232535/how-to-use-reflection-to-call-ジェネリックメソッド) – nawfal

答えて

0

私は私の答えhere

は実際にリフレクションを使用してジェネリックで動作するように私たちを助けるいくつかのMakeGenericXXXの方法があると思われました。

0

インスタンスのメソッドを呼び出すには、Type.InvokeMemberを使用します。また、パフォーマンスが心配な場合は、呼び出す必要のある手順を示すDelegateのセットをキャッシュします。

0

私は、カスタムアトリビュートを使用するのが最良の方法は、実行時に特定のアトリビュートを持つメソッドを探すことができると思います。

+0

私のイベントハンドラメソッドを見つけるために属性を使用することができますが、まだ私はthem.Actually私はどのように呼び出す方法がわからない実行時にEventRegistryのSubscribeメソッド – Beatles1692

関連する問題