257 votes

Se désabonner de méthode anonyme en c#

Est-il possible de vous désabonner d’une méthode anonyme d’un événement ?

Si je m’abonne à un événement comme celui-ci :

Je peux ONU-s’abonner à ceci :

Mais si je m’abonne à l’aide d’une méthode anonyme :

est-il possible de vous désabonner de cette méthode anonyme ? Dans l’affirmative, comment ?

252voto

Jacob Krall Points 10327
<pre><code></code><p>Il suffit de garder une référence au délégué autour.</p></pre>

151voto

J c Points 3498

Une technique consiste à déclarer une variable destinée à contenir la méthode anonyme qui serait alors disponible à l’intérieur de la méthode anonyme lui-même. Cela a fonctionné pour moi, car le comportement souhaité est de se désabonner après que l’événement a été géré.

Exemple :

25voto

Jon Skeet Points 692016

De la mémoire, la spécification explicitement ne garantit pas le comportement de toute façon quand il s’agit de l’équivalence des délégués créé avec les méthodes anonymes.

Si vous souhaitez vous désabonner, vous devriez utiliser une méthode « normale » ou conserver le délégué quelque part d’autre, donc vous pouvez vous désabonner avec exactement le même délégué que vous avez utilisée pour vous abonner.

12voto

hemme Points 878

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X