Prism - EventAggregator.GetEvent<>.Subscribe() -使用泛型&约束

本文关键字:泛型 约束 Subscribe GetEvent EventAggregator Prism | 更新日期: 2023-09-27 18:16:43

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

如果我用

eventAggregator.GetEvent<string>().Subscribe(MyMethod)

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

但是,当移动到一个比字符串更复杂的对象时,我遇到了问题。

我有一堆类,所有从接口(IRequest)派生,例如

我有我的事件类设置如下

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

我有一个通用类(MyClass),它在里面使用IRequest的对象-再次,一切似乎都在这一点上工作。

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

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);

Prism - EventAggregator.GetEvent<>.Subscribe() -使用泛型&约束

MyEvent<IRequest>MyEvent<Profile>不相同,因此EventAggregator不会将其视为相同的事件。为了允许协变类型,可以在c# 4中使用out修饰符来修复它。像这样的代码应该可以工作:

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 { }

那么你的事件聚合器看起来像:

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

这有帮助吗?