我为我们的应用程序编写了一个小型的发布/子系统,
您通过实现 IHandle 订阅消息
假设订阅者实现 IHandle<IEnumerable<MyType>>
然后有人发布了一条类型为 ICollection<MyType>>
的消息这当然应该触发订阅者,因为 ICollection<> 的类型为 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>
的所有类型
有什么想法吗?
最佳答案
您需要将 IHandle
定义为逆变,这样您就不需要解决:
interface IHandle<in T>
这样它将接受所有继承自 IEnumerable 的类型
这个link为您详细解释了协方差和逆变如何与 genric 配合使用
关于c# - IEnumerable<T> 等于 ICollection<T> 类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12528577/