Angesichts der folgende Schnittstelle:Sammlung von verschiedenen generischen Typen
public interface IEventHandler<in TEvent> where TEvent : IEvent
{
void Process(TEvent @event);
}
Welche IEnumerable-Typ kann ich eine Sammlung von IEventHandler<TEvent>
Implementierungen speichern verwenden, wo TEvent anders ist?
das heißt die folgenden 3-Implementierungen Gegeben:
public class BlahEvent1EventHandler : IEventHandler<Event1>
{
...
}
public class WhateverEvent1EventHandler : IEventHandler<Event1>
{
...
}
public class BlahEvent2EventHandler : IEventHandler<Event2>
{
...
}
Kann ich besser als eine Sammlung von Objekten?
var handlers = new List<object>
{
new BlahEvent1EventHandler(),
new WhateverEvent1EventHandler(),
new BlahEvent2EventHandler(),
};
BTW, haben einige andere Antworten befürworten die Verwendung eines Basistyp oder geerbt nicht-generische Schnittstelle zu sehen, kann aber nicht sehen, wie das eine riesige Menge an Wert in diesem Fall hinzufügen würde, es sei denn ich bin etwas fehlt. Ja, es würde mir erlauben, sie alle in der Sammlung in einer etwas typsichereren Art und Weise als Objekt hinzuzufügen, aber ich würde nicht über sie iterieren und die stark typisierte Process-Methode ohne Casting aufrufen, so wie ich es mit dem Objekt tun müsste.
public interface IEventHandler
{
}
public interface IEventHandler<in TEvent> : IEventHandler where TEvent : IEvent
{
void Process(TEvent @event);
}
Ich brauche immer noch, wenn ich IEnumerable<IEventHandler>
oder IEnumerable<obect>
haben zu werfen
foreach (var handler in _handlers.Cast<IEventHandler<TEvent>>())
{
handler.Process(@event);
}
Irgendwelche Gedanken darüber, wie dies zu verbessern?
Ich glaube nicht, das schwach typisierte Liste und bietet kapselt es ein Weg herum. Ich würde gerne einige interessante Inputs dazu hören, da ich fast täglich in der gleichen Ausgabe laufe. –
Protip: Benennen Sie Ihre Variablen nicht wie bei den Sprachbegriffen. – tomfanning
Da Elemente unterschiedlicher Typen in der Liste den Aufruf einer anderen 'Prozess'-Methode mit unterschiedlichen Argumenttypen erfordern, wie würden Sie sie nennen? Beachten Sie, dass hier keine Methodenüberladung auftreten würde, da der Typ eines Listenelements nur zur Laufzeit bekannt ist. Der Zweck von Generika ist das Bereitstellen eines statischen Typs, der zur Kompilierungszeit bekannt ist. –