Prism – EventAggregator.GetEvent 。订阅() – 使用generics和约束

我有一个问题订阅事件Aggregator事件作为prism框架的一部分。

如果我使用像

eventAggregator.GetEvent().Subscribe(MyMethod) 

然后一切正常,我的方法在事件发布时触发。

但是,当移动到除I string之外的更复杂的对象时,我遇到了问题。

我有一堆类,它们都来自一个接口(IRequest),例如

我的事件类设置如下

 public class MyEvent : PubSubEvent<MyClass> where TRequest : IRequest {} 

我有一个generics类(MyClass)在其中使用IRequest的对象 – 再次,在这一点上似乎一切正常。

现在,假设我发布了一个使用其中的对象Profile的MyClass事件:

 eventAggregator.GetEvent<MyEvent>().Publish(myProfileObject); 

在我的订阅中,我想要一个可以捕获MyEvent的所有事件的方法 – 与T是Profile还是从IRequest派生的其他对象无关 – 这是我似乎遇到问题的地方。

在下面的例子中,第一个工作,但第二个没有 – 我理想的是喜欢使用类似于第二个的东西。

 eventAggregator.GetEvent<MyEvent>().Subscribe(test1); void test1 (MyClass obj) { //Some stuff here } eventAggregator.GetEvent<MyEvent>().Subscribe(test2); void test2(MyClass obj) where T : IRequest { //never gets called } 

我的假设是因为Profile来自IRequest然后它应该工作??? 但它不!

任何帮助,将不胜感激。

UPDATE
如果我使用以下内容,它确实有效,但需要我为每种类型的IRequest创建一个单独的订阅 – 我希望只有一个订阅。

 eventAggregator.GetEvent<MyEvent>().Subscribe(test2); eventAggregator.GetEvent<MyEvent>().Subscribe(test2); 

MyEventMyEvent不相同,因此EventAggregator不会将此视为同一事件。 要允许协变类型,可以使用C#4中的out修饰符修复它。这样的东西应该有效:

 public interface IMyClass where T : IRequest { } public class MyClass : IMyClass where T : IRequest { } public class MyEvent : PubSubEvent> where TValue : IRequest { } 

然后你的事件聚合器看起来像:

  _eventAggregator.GetEvent>().Subscribe(Received); private void Received(IMyClass obj) { } _eventAggregator.GetEvent>().Publish(new MyClass()); 

这有帮助吗?