给定以下界面:
public interface IEventHandler<in TEvent> where TEvent : IEvent
{
void Process(TEvent @event);
}
我可以使用什么 IEnumerable 类型来存储IEventHandler<TEvent>
TEvent 不同的实现集合?
即给定以下3个实现:
public class BlahEvent1EventHandler : IEventHandler<Event1>
{
...
}
public class WhateverEvent1EventHandler : IEventHandler<Event1>
{
...
}
public class BlahEvent2EventHandler : IEventHandler<Event2>
{
...
}
我能比对象集合做得更好吗?
var handlers = new List<object>
{
new BlahEvent1EventHandler(),
new WhateverEvent1EventHandler(),
new BlahEvent2EventHandler(),
};
顺便说一句,已经看到其他一些提倡使用基本类型或继承的非泛型接口的答案,但除非我遗漏了什么,否则看不到在这种情况下这将如何增加大量价值。是的,它可以让我以一种比使用对象更安全的方式将它们全部添加到集合中,但不会让我迭代它们并调用强类型的 Process 方法而不进行强制转换,就像我需要对对象做的那样。
public interface IEventHandler
{
}
public interface IEventHandler<in TEvent> : IEventHandler where TEvent : IEvent
{
void Process(TEvent @event);
}
如果我有IEnumerable<IEventHandler>
或IEnumerable<obect>
foreach (var handler in _handlers.Cast<IEventHandler<TEvent>>())
{
handler.Process(@event);
}
关于如何改善这一点的任何想法?