Tenir compte le code suivant:usine générique pour les sous-classes concrètes
public interface IEventHandler<in T> where T : IEvent
{
void Execute(T @event);
}
Pour ces gestionnaires je mets en œuvre certains gestionnaires sous-classes concrètes:
public class SomeEventHandler : IEventHandler<SomeEvent>
{
public void Execute(SomeEvent @event) { /* ... */ }
}
Maintenant, j'ai une usine pour récupérer le gestionnaire correspondant d'un Événement:
public class EventHandlerFactory : IEventHandlerFactory
{
public IEventHandler<T> Create<T>(T @event) where T : IEvent
{
// What to do in here?
}
}
J'ai essayé de vérifier le type de l'événement, puis de retourner le corre gestionnaire corres, mais bien sûr, le système de type nie:
if(@event is SomeEvent)
{
return (IEventHandler<T>) new SomeEventHandler();
}
Je ne ferais pas cela si hacky, mais je me demande comment permettre le code de faire cette interface avec le Create<T>
possible.
EDIT: Quand je boucle à travers un enumarable d'événements T est traité comme IEvent de sorte que le système de type jetterai une exception:
var events = IEnumarable<IEvent>() { /* ... */ };
foreach (var @event in events)
{
var eventHandler = eventHandlerFactory.Create(@event);
}
Le Create(T @event)
-method lèveront une exception, car T est un IEvent et pas le type concret. Je pourrais le résoudre en utilisant (dynamic) @event
mais ce n'est pas ce que je veux vraiment faire.
[Veuillez ne pas placer de balises dans les titres des questions] (https://stackoverflow.com/help/tagging) – Liam
Copie possible de [Créer une instance de type générique?] (Https://stackoverflow.com/questions/731452/ create-instance-of-ge neric-type) – Liam
Ce qui crée ceci - 'events = IEnumarable()' - que contient le code commenté? D'où viennent les 'IEvent's –
Alex