为Prism EventAggregator使用通用PubSubEvents时的泛型约束报错问题
解决Prism EventAggregator封装时的泛型约束错误
我来帮你梳理下这个问题的根源和对应的解决方案:
问题根源
Prism的EventAggregator.GetEvent<T>()方法有两个硬性要求:
T必须是非抽象的PubSubEvent<TPayload>派生类T必须具备公共无参构造函数(因为EventAggregator内部会创建或复用该事件类型的实例)
你当前的泛型约束只指定了T1 : CachedEvent<T2>,但没有明确要求T1是非抽象且可实例化,所以编译器会抛出"'T1'必须是非抽象类..."的错误提示。
修正后的代码
protected void Subscription<T1, T2>(Action<T2> onSubscribe) where T1 : CachedEvent<T2>, new() { T1 @event = _eventAggregator.GetEvent<T1>(); @event.Subscribe(onSubscribe, true); // 其他代码 }
关键调整说明
- 添加
new()约束:这个约束会告诉编译器T1必须拥有公共无参构造函数,既满足GetEvent<T>()的实例化要求,同时也隐含了T1是非抽象类(抽象类无法被实例化,new()约束会自动排除抽象类型)。 - 修正拼写错误:你代码里的
Subcribe是拼写失误,正确的方法名是Subscribe,这个细节要修正避免运行时出现找不到方法的问题。
如果你的CachedEvent<T>本身是抽象类,只要T1是它的非抽象子类,加上new()约束就完全符合EventAggregator的要求;如果CachedEvent<T>是非抽象类,这个约束也能确保它可以被EventAggregator正确实例化。
内容的提问来源于stack exchange,提问作者Marlon Dumal-is
相关产品推荐
相关产品推荐

