给出以下界面:
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);
}
有关如何改善这一点的任何想法?
如果您需要枚举处理程序并调用其 Process 接口成员,那么您可以像这样实现您的类:
public class BlahEvent1EventHandler : IEventHandler<IEvent>
{
    ...
}
public class WhateverEvent1EventHandler : IEventHandler<IEvent>
{
    ...
}
public class BlahEvent2EventHandler : IEventHandler<IEvent>
{
    ...
}
public class Event1 : IEvent
{}
public class Event2 : IEvent
{}
然后使用它们:
List<IEventHandler<IEvent>> list = new List<IEventHandler<IEvent>>();
list.Add(new BlahEvent1EventHandler());
foreach (IEventHandler<IEvent> eventHandler in list)
{
eventHandler.Process(new Event1());
}