不同类型的集合

Pau*_*les 5 c# generics

给出以下界面:

public interface IEventHandler<in TEvent> where TEvent : IEvent
{
    void Process(TEvent @event);
}
Run Code Online (Sandbox Code Playgroud)

我可以使用什么IEnumerable类型来存储IEventHandler<TEvent>TEvent不同的实现集合?

即给出以下3个实现:

public class BlahEvent1EventHandler : IEventHandler<Event1>
{
    ...
}

public class WhateverEvent1EventHandler : IEventHandler<Event1>
{
    ...
}

public class BlahEvent2EventHandler : IEventHandler<Event2>
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我可以比一组对象做得更好吗?

        var handlers = new List<object>
                           {
                               new BlahEvent1EventHandler(),
                               new WhateverEvent1EventHandler(),
                               new BlahEvent2EventHandler(),
                           };
Run Code Online (Sandbox Code Playgroud)

顺便说一句,已经看到一些其他的答案提倡使用基类型或继承的非通用接口,但看不出在这种情况下如何增加大量的价值,除非我遗漏了一些东西.是的,它会让我以一种稍微更安全的方式将它们全部添加到集合中,使用对象,但不会让我迭代它们并调用强类型的Process方法而不像我需要对象那样进行转换.

public interface IEventHandler
{        
}

public interface IEventHandler<in TEvent> : IEventHandler where TEvent : IEvent
{
    void Process(TEvent @event);
}
Run Code Online (Sandbox Code Playgroud)

我仍然需要施放,如果我有IEnumerable<IEventHandler>IEnumerable<obect>

foreach (var handler in _handlers.Cast<IEventHandler<TEvent>>())
{
    handler.Process(@event);
}
Run Code Online (Sandbox Code Playgroud)

有关如何改善这一点的任何想法?

Ham*_*yan 0

如果您需要枚举处理程序并调用其 Process 接口成员,那么您可以像这样实现您的类:

public class BlahEvent1EventHandler : IEventHandler<IEvent>
{
    ...
}

public class WhateverEvent1EventHandler : IEventHandler<IEvent>
{
    ...
}

public class BlahEvent2EventHandler : IEventHandler<IEvent>
{
    ...
}

public class Event1 : IEvent
{}

public class Event2 : IEvent
{}
Run Code Online (Sandbox Code Playgroud)

然后使用它们:

List<IEventHandler<IEvent>> list = new List<IEventHandler<IEvent>>();

list.Add(new BlahEvent1EventHandler());

foreach (IEventHandler<IEvent> eventHandler in list)
{
eventHandler.Process(new Event1());
}
Run Code Online (Sandbox Code Playgroud)