2017-09-11 5 views
0

J'ai besoin d'un IDictionary<T,K> qui déclenche un événement à chaque fois qu'un item est ajouté via la méthode Add. Mais l'événement déclenché devrait dépendre de la clé de item, à savoir si j'ajoute ("hello","world") à un tel dictionnaire, le « bonjour » -event devrait être élevé, et si j'ajoute ("world","hello"), le -event « monde » devrait être soulevée .Impossible de définir EventHandler comme événement

J'ai donc essayé de mettre en œuvre cela et a fini avec

class EventDictionary<T,K> : IDictionary<T,K> 
{ 
    private IDictionary<T,K> _internalDic; 
    private IDictionary<T, EventHandler> _onAddHandlers; 

    public EventHandler OnAdd(T key) 
    { 
     if (!_onAddHandlers.ContainsKey(key)) 
      _onAddHandlers[key] = null; 
     return _onAddHandlers[key]; 
    } 

    public void Add(T key, K value) 
    { 
     _internalDic.Add(key, value); 
     OnAdd(key)?.Invoke(this, EventArgs.Empty); 
    } 

    public void Add(KeyValuePair<T, K> item) 
    { 
     _internalDic.Add(item); 
     OnAdd(item.Key)?.Invoke(this, EventArgs.Empty); 
    } 

    ... // implementing the other methods of IDictionary<T,K> 
} 

Cette compile - aussi longtemps que je ne fais pas le mot-clé event:

private IDictionary<T, event EventHandler> _onAddHandlers; // syntax error 

OU

public event EventHandler OnAdd(T key) { ... } // syntax error 

Ai-je manqué quelque chose? Comment puis-je créer les gestionnaires d'événements OnAdd (tous) event s?

+0

@ itsme86 Cela ne compilerait pas non plus, contrairement au code original de l'OP, qui fonctionnera très bien. – Servy

+0

L'événement n'est pas un type. C'est un mot-clé. EventHandler est le type –

Répondre

1

Il n'y a pas moyen d'avoir un certain nombre d'événements sur dynamique type. Les événements, tout comme les autres membres (champs, méthodes, propriétés) doivent être définis de manière statique au moment de la compilation. Vous pouvez donc avoir votre dictionnaire de délégués, et vous pouvez ajouter/supprimer des délégués du dictionnaire, et invoquer ces délégués quand vous voulez, mais ils ne seront pas des événements sur cette classe; ils devront passer par des méthodes, comme vous l'avez fait jusqu'ici.

Si, au contraire, vous voulez juste avoir un seul événement où la signature de l'événement est l'un où il accepte un paramètre de type T, il vous suffit d'utiliser un délégué approprié, au lieu de EventHandler, lorsque déclarer votre événement:

public event Action<T> OnAdd; // syntax error 
+0

Mais vous pouvez utiliser un générique EventHandler d'avoir un effet similaire –

+0

@YairHalberstadt Vous pouvez avoir un seul événement * * qui accepte un 'T' comme paramètre. Vous ne pouvez pas avoir le nom/la définition de l'événement dynamique. – Servy

+0

Oui. Mais en fonction de ce qu'il veut faire, il pourrait être suffisant –