使用Reflection订阅Prism EventAggregator事件

时间:2012-10-23 16:41:45

标签: c# silverlight reflection prism eventaggregator

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

我想要实现的是在我的一个模块中调用_eventAggregator.GetEvent<MyType>().Subscribe(MyAction),但我仍然在调用_eventAggregator.GetEvent<MyType>()。如何从那里开始致电Subscribe(MyAction)

说我的事件类是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>();

我真的很感激指针朝着正确的方向发展。

3 个答案:

答案 0 :(得分: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)
{
}

现在你真的不需要知道“事件类型”是什么。

答案 1 :(得分:1)

可能就像这样简单:

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

假设你知道有效载荷类型。

就个人而言,我看到在模块之外消耗的聚合事件作为此模块的API,我尝试将它们放在某种其他模块可以编译的共享程序集中。

答案 2 :(得分:0)

我找到了有效负载类型未知的情况的答案:

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

  
      
  1. 添加EventAggregator.GetEvent(类型eventType)以获取没有通用参数的事件

  2.   
  3. 使用反射构建Action类型的表达式

  4.   
  5. 使用反射订阅事件(即调用Subscribe方法)并将Expression.Compile作为参数传递。

  6.         

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