Au lieu de garder une référence à un délégué, vous pouvez instrument de votre classe afin de donner à la manifestation de la liste d'invocation à l'appelant. Fondamentalement, vous pouvez écrire quelque chose comme ceci (en supposant que MyEvent est déclarée à l'intérieur d'MyClass):
public class MyClass
{
public event EventHandler MyEvent;
public IEnumerable<EventHandler> GetMyEventHandlers()
{
return from d in MyEvent.GetInvocationList()
select (EventHandler)d;
}
}
Vous pouvez donc accéder à l'ensemble de la liste d'invocation de l'extérieur de MyClass et vous désinscrire à tout gestionnaire vous le souhaitez. Par exemple:
myClass.MyEvent -= myClass.GetMyEventHandlers().Last();
J'ai écrit un post complet sur cette tecnique ici.