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);
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>());
这有帮助吗?