2012-03-16 25 views
5

Tengo una clase A ... en su constructor ... Estoy asignando una función anónima a event_B's eventHandler.¿Cómo darse de baja una función anónima en el método de eliminación de una clase?

¿Cómo elimino (anular la suscripción) del método de eliminación de la clase A?

¡Cualquier ayuda sería apreciada! Gracias

Public Class A 
{ 

public A() 
{ 

B_Object.DataLoaded += (sender, e) => 
       { 
        Line 1 
        Line 2 
        Line 3 
        Line 4 
       }; 
} 

Public override void Dispose() 
{ 
    // How do I unsubscribe the above subscribed anonymous function ? 
} 
} 
+0

¿Qué es B_Object? ¿Es una variable miembro de la Clase A? Y se accede a él en cualquier lugar fuera de A; ¿podría tener otros oyentes? –

+0

posible duplicado de [Anular suscripción método anónimo en C#] (http://stackoverflow.com/questions/183367/unsubscribe-anonymous-method-in-c-sharp) –

+0

sí, es miembro ... qué instancia de clase B – Relativity

Respuesta

7

No puedes, básicamente. O bien moverlo a un método, o utilizar una variable miembro para mantener el delegado para más adelante:

public class A : IDisposable 
{ 
    private readonly EventHandler handler; 

    public A() 
    { 
     handler = (sender, e) => 
     { 
      Line 1 
      Line 2 
      Line 3 
      Line 4 
     }; 

     B_Object.DataLoaded += handler; 
    } 

    public override void Dispose() 
    { 
     B_Object.DataLoaded -= handler; 
    } 
} 
+0

maldita sea, ¡me has vencido! – Robbie

+0

Entonces, si no nos damos de baja, obviamente introducirá una fuga de memoria, ¿verdad? – Relativity

+1

@Relativity: No necesariamente. Realmente no has hablado sobre 'B_Object.DataLoaded' - si eso es * en realidad * un evento de instancia en lugar de un evento estático, entonces si el objeto es recolectado, la suscripción al evento ya no tendrá importancia. Todo depende del contexto ... –

0

Esta es una alternativa sin usar una variable de controlador.

Public Class A 
{ 

public A() 
    { 

    B_Object.DataLoaded += (sender, e) => 
       { 
        Line 1 
        Line 2 
        Line 3 
        Line 4 
       }; 
    } 

    Public override void Dispose() 
    { 
    if(B_Object.DataLoaded != null) 
    { 
    B_Object.DataLoaded -= 
     (YourDelegateType)B_Object.DataLoaded.GetInvocationList().Last(); 
     //if you are not sure that the last method is yours than you can keep an index 
     //which is set in your ctor ... 
    } 
    } 
} 
Cuestiones relacionadas