Prism - EventAggregator.GetEvent<> .Subscribe() - 使用Generics&约束上

时间:2015-10-08 13:56:36

标签: c# generics prism eventaggregator

我遇到了一个问题,订阅事件聚合器作为prism框架的一部分。

如果我使用

之类的东西
eventAggregator.GetEvent<string>().Subscribe(MyMethod)

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

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

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

我的事件类设置如下

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

我有一个泛型类(MyClass),它在其中使用了一个IRequest对象 - 再次,在这一点上似乎一切正常。

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

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

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

在下面的例子中,第一个是有效的,但是第二个没有 - 我最好使用类似于第二个的东西。

eventAggregator.GetEvent<MyEvent<Profile>>().Subscribe(test1);
void test1 (MyClass<Profile> obj)
{
  //Some stuff here
}

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

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

任何帮助都将不胜感激。

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

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

1 个答案:

答案 0 :(得分:3)

main_hash["query"]["filtered"]["query"] MyEvent<IRequest>不相同,因此EventAggregator不会将此视为同一事件。要允许协变类型,您可以使用C#4中的 out 修饰符来修复它。这样的事情应该有效:

MyEvent<Profile>

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

public interface IMyClass<out T> where T : IRequest { }

public class MyClass<T> : IMyClass<T> where T : IRequest { }

public class MyEvent<TValue> : PubSubEvent<IMyClass<TValue>> where TValue : IRequest { }

这有帮助吗?