1

実行時に Prism モジュール間でイベント サブスクリプションを動的に接続しようとしているため、Reflection を使用して EventAggregator イベントをサブスクライブしたいと考えています。(Silverlight 5、Prism、MEF を使用しています)。

私が達成したい_eventAggregator.GetEvent<MyType>().Subscribe(MyAction)のは、モジュールの 1 つで呼び出しを行うことですが、呼び出しに行き詰まってい_eventAggregator.GetEvent<MyType>()ます。そこから電話するにはどうすればよいSubscribe(MyAction)ですか?

私の Event クラスがpublic class TestEvent : CompositePresentationEvent<string> { }. これはコンパイル時にはわかりませんが、実行時の Type はわかります。

これが私がこれまでに得たものです:

 Type myType = assembly.GetType(typeName); //get the type from string

 MethodInfo method = typeof(IEventAggregator).GetMethod("GetEvent");
 MethodInfo generic = method.MakeGenericMethod(myType);//get the EventAggregator.GetEvent<myType>() method

 generic.Invoke(_eventAggregator, null);//invoke _eventAggregator.GetEvent<myType>();

正しい方向へのポインタをいただければ幸いです。

4

3 に答える 3

3

ダイナミクスを使用して呼び出すイベントの「タイプ」を気にすることなく、これを行うことができます。

Type eventType = assembly.GetType(typeName);
MethodInfo method = typeof(IEventAggregator).GetMethod("GetEvent");
MethodInfo generic = method.MakeGenericMethod(eventType);
dynamic subscribeEvent = generic.Invoke(this.eventAggregator, null);

if(subscribeEvent != null)
{
    subscribeEvent.Subscribe(new Action<object>(GenericEventHandler));
}

//.... Somewhere else in the class

private void GenericEventHandler(object t)
{
}

これで、「イベント タイプ」が何であるかを知る必要がなくなりました。

于 2012-12-12T18:54:30.443 に答える
1

次のように簡単にできますか?

var myEvent = generic.Invoke(eventAggregator, null) as CompositePresentationEvent<string>;
if (myEvent != null) 
    myEvent.Subscribe(MyAction);

ペイロードタイプを知っていると仮定します。

個人的には、このモジュールの API としてモジュールの外部で消費される集約されたイベントを見て、他のモジュールがコンパイルできる何らかの共有アセンブリにそれらを配置しようとしています。

于 2012-10-24T01:46:05.550 に答える
0

ここでペイロードタイプが不明な場合の答えを見つけました:

http://compositewpf.codeplex.com/workitem/6244

  1. EventAggregator.GetEvent(Type eventType) を追加して、汎用パラメータなしでイベントを取得します

  2. リフレクションを使用して Action 型の式を作成する

  3. リフレクションを使用して (つまり、Subscribe メソッドを呼び出して) イベントにサブスクライブし、パラメーターとして Expression.Compile を渡します。

これは、KeepAlive が true の場合に機能します。

于 2012-11-12T13:43:31.167 に答える