我为我们的应用编写了一个小型的pub / sub系统,
您通过实施IHandle
订阅消息让我们说订阅者实现了IHandle<IEnumerable<MyType>>
然后有人发布了ICollection<MyType>>
类型的消息,因为IColletion&lt;&gt;属于IEnumerable类型&lt;&gt;
但我的代码不支持这个,一个解决方法是发布者将ICollection转换为IEnumerable,但它容易在更大的团队中出错。
这是无效的代码
public void Publish<T>(T message) where T : class
{
if (config.EnableEventAggregator)
subscribers.OfType<IHandle<T>>()
.ForEach(s => s.Handle(message));
}
我希望它为所有继承IHandle<IEnumerable>
的类型找到IEnumerable<T>
有什么想法吗?
答案 0 :(得分:3)
您需要将IHandle
定义为 contra-variant ,以便您无需解决此问题:
interface IHandle<in T>
通过这种方式,它将接受从IEnumerable继承的所有类型
此link详细解释了协方差和反方差如何与genric一起使用