鑑於以下接口:收集不同泛型類型
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(),
};
BTW,看到了一些其他的答案提倡使用基本類型或繼承的非通用接口,但不能看到如何將在此情況下,增加了巨大的價值,除非量我失去了一些東西。是的,它可以讓我把它們全部添加到集合中,以一種稍微更安全的方式使用對象,但不會讓我遍歷它們並調用強類型的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);
}
,關於如何提高這個有什麼想法?
提供了一個強類型接口的新的集合類,我不認爲有一個方法。很高興聽到這方面的一些有趣的投入,因爲我幾乎每天都會遇到同樣的問題。 –
Protip:不要將您的變量命名爲與語言關鍵字相同的名稱。 – tomfanning
由於列表中不同類型的項目需要使用不同參數類型的不同類型的「Process」方法,因此如何調用它們?請注意,此處不會出現方法重載解析,因爲列表元素的類型僅在運行時才知道。泛型的目的是提供編譯時已知的靜態類型。 –