2

我为我们的应用程序编写了一个小型 pub/sub 系统,

你通过实现 IHandle 来订阅消息

假设订户实现IHandle<IEnumerable<MyType>>

然后有人发布类型的消息,ICollection<MyType>>这当然应该触发订阅者,因为 IColletion<> 是类型 IEnumerable<>

但是我的代码不支持这一点,解决方法是发布者将 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>

4

1 回答 1

3

您需要定义IHandle逆变,这样您就不需要解决:

interface IHandle<in T>

通过这种方式,它将接受从 IEnumerable 继承的所有类型

这个链接为你详细解释了协方差和逆变如何与 genric 一起工作

于 2012-09-21T10:26:50.463 回答