gpt4 book ai didi

c# - 不同泛型类型的集合

转载 作者:太空狗 更新时间:2023-10-29 23:24:38 25 4
gpt4 key购买 nike

给定以下界面:

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(),
};

顺便说一句,已经看到一些其他的答案提倡使用基类型或继承的非泛型接口(interface),但看不到在这种情况下这将如何增加巨大的值(value),除非我遗漏了什么。是的,它可以让我以一种比使用对象稍微更安全的方式将它们全部添加到集合中,但不会让我迭代它们并调用强类型的 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);
}

关于如何改进它有什么想法吗?

最佳答案

我认为最好的方法是使用 OfType扩展方法并保留您的列表,假设事件类型在编译时已知;仍然会有类型转换,但您不会这样做,您只会获得可以实际处理该事件的条目。

关于c# - 不同泛型类型的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13456702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com