我想使用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>();
我真的很感激指针朝着正确的方向发展。
答案 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
添加EventAggregator.GetEvent(类型eventType)以获取没有通用参数的事件
使用反射构建Action类型的表达式
- 醇>
使用反射订阅事件(即调用Subscribe方法)并将Expression.Compile作为参数传递。
如果KeepAlive为真,则此方法有效。