Darse de baja del método anónimo en C#
¿Es posible darse de baja de un evento mediante un método anónimo?
Si me suscribo a un evento como este:
void MyMethod()
{
Console.WriteLine("I did it!");
}
MyEvent += MyMethod;
Puedo darme de baja así:
MyEvent -= MyMethod;
Pero si me suscribo usando un método anónimo:
MyEvent += delegate(){Console.WriteLine("I did it!");};
¿Es posible darse de baja de este método anónimo? ¿Si es así, cómo?
Action myDelegate = delegate(){Console.WriteLine("I did it!");};
MyEvent += myDelegate;
// .... later
MyEvent -= myDelegate;
Simplemente mantenga una referencia al delegado.
Una técnica consiste en declarar una variable para contener el método anónimo que luego estaría disponible dentro del propio método anónimo. Esto funcionó para mí porque el comportamiento deseado era cancelar la suscripción después de que se manejara el evento.
Ejemplo:
MyEventHandler foo = null;
foo = delegate(object s, MyEventArgs ev)
{
Console.WriteLine("I did it!");
MyEvent -= foo;
};
MyEvent += foo;
Desde que se lanzó la función de funciones locales de C# 7.0 , el enfoque sugerido por Jc se vuelve realmente interesante.
void foo(object s, MyEventArgs ev)
{
Console.WriteLine("I did it!");
MyEvent -= foo;
};
MyEvent += foo;
Entonces, honestamente, aquí no tienes una función anónima como variable. Pero supongo que la motivación para usarlo en su caso se puede aplicar a funciones locales.