次のインターフェースがあるとします。
public interface IEventHandler<in TEvent> where TEvent : IEvent
{
void Process(TEvent @event);
}
IEventHandler<TEvent>
TEvent が異なる実装のコレクションを格納するには、どの IEnumerable 型を使用できますか?
つまり、次の 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);
}
これを改善する方法について何か考えはありますか?