1

我想使用反射订阅 EventAggregator 事件,因为我试图在运行时动态连接 Prism 模块之间的事件订阅。(我使用的是 Silverlight 5、Prism 和 MEF)。

我想要实现的是调用_eventAggregator.GetEvent<MyType>().Subscribe(MyAction)我的一个模块,但我被困在调用_eventAggregator.GetEvent<MyType>(). 我怎样才能从那里开始打电话Subscribe(MyAction)

假设我的 Event 课程是public class TestEvent : CompositePresentationEvent<string> { }. 我在编译时不知道这一点,但我在运行时知道类型。

这是我到目前为止所得到的:

 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. 使用反射订阅事件(即调用订阅方法)并将 Expression.Compile 作为参数传递。

如果 KeepAlive 为真,则此方法有效。

于 2012-11-12T13:43:31.167 回答