2012-03-16 15 views
5

Ho una classe A ... nel suo costruttore ... Sto assegnando una funzione anonima all'evento eventHandler.Come annullare l'iscrizione a una funzione anonima nel metodo Dispose di una classe?

Come rimuovere (annullare l'iscrizione) dal metodo Dispose della classe A?

Qualsiasi aiuto sarebbe apprezzato! Grazie

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

Che cos'è B_Object? È una variabile membro di Classe A? Ed è accessibile ovunque al di fuori di A; potrebbe avere altri ascoltatori? –

+0

possibile duplicato di [Annulla sottoscrizione metodo anonimo in C#] (http://stackoverflow.com/questions/183367/unsubscribe-anonymous-method-in-c-sharp) –

+0

sì, è membro ... quale istanza di Classe B – Relativity

risposta

7

Non è possibile, in sostanza. O spostarlo in un metodo, o utilizzare una variabile membro per mantenere il delegato per dopo:

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

dannazione, mi hai battuto! – Robbie

+0

Quindi, se non abbiamo annullato l'iscrizione ... ovviamente introdurrà una perdita di memoria, giusto? – Relativity

+1

@Relativity: non necessariamente. Non hai davvero parlato di 'B_Object.DataLoaded' - se questo è * effettivamente * un evento istanza piuttosto che un evento statico, quindi se l'oggetto viene raccolto l'iscrizione all'evento non avrà più importanza. Tutto dipende dal contesto ... –

0

Questa è un'alternativa senza utilizzare una variabile di gestione.

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 ... 
    } 
    } 
} 
Problemi correlati