Idéalement je veux une fonction quelque chose comme ce qui suit (cet exemple ne compile pas):C# Comment faire pour supprimer et nettoyer tous les événements
void AddRemoveEvent<TEvent, TArgs>(TEvent e, EventHandler<TArgs> h, bool add)
where TArgs : System.EventArgs
{
if (add)
{
e += h;
}
else
{
e -= h;
}
}
Je peux écrire des fonctions:
void AddRemoveEvents(bool add)
{
AddRemoveEvent(aMemberControl.Click, OnClick, add);
}
I alors sais que je peux appeler à nouveau la fonction pour supprimer tous les gestionnaires. Je pense que ce serait mieux que d'écrire, en gardant et en comptant sur deux fonctions étant maintenues en synchronisation:
void AddEvents(bool add)
{
aMemberControl.Click += OnClick;
}
void RemoveEvents(bool add)
{
aMemberControl.Click -= OnClick;
}
Un collègue a écrit une classe à portée de main qui fait ce genre de choses qui utilise la réflexion. C'est très utile, mais cela dépend du nom de l'événement transmis en tant que chaîne. Je suis à la recherche d'un version de sécurité. Est-ce que quelqu'un a des idées sur s'il est possible d'écrire ceci?
Merci.
Je sais que je ne devrais pas vraiment avoir à désengorger des choses partout parce que le garbage collector devrait prendre soin de la plupart des cas. Mais, parfois, un événement parasite provoque une fuite, et donc je trouve qu'il est plus sûr d'essayer de supprimer tous les événements que j'ajoute plutôt que d'essayer de jouer avec un profileur en essayant d'identifier ceux qui causent des problèmes.
Je l'ai vu cette question connexe:
How to remove all event handlers from a control