2016-06-27 7 views
2

ich ein Ereignis haben, wie folgt:Entfernen eines Delegaten von einem Ereignis

public event EventHandler<CustomEventArgs> RaiseCustomEvent; 

Hier einige Code ist ein Delegierter aus dem obigen Fall zu entfernen, die ich gearbeitet habe:

public void RemoveDelegate(Delegate del) 
{ 
    RaiseCustomEvent -= (EventHandler<CustomEventArgs>)del; 
} 

Hier einige ist Code, den ich geschrieben habe, einen Delegierten zu entfernen, wo ich den Ereignisnamen kennen:

public void RemoveRaiseCustomEventDelegate(Delegate del, string eventName) 
{ 
    var field = this.GetType().GetField(eventName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField); 

    var fieldValue = field.GetValue(this) as EventHandler<CustomEventArgs>; 
    fieldValue -= (EventHandler<CustomEventArgs>)del; 
} 

In dem obigen Code, der fieldValue wird auf null gesetzt, wenn jedoch das Ereignis ausgelöst wird, gibt es immer noch einen Abonnenten.

Kann ich bitte etwas Hilfe haben, um einen Delegaten von einem Ereignis zu entfernen, wo ich nur den Ereignisnamen habe?

+0

wenn sich 'fieldValue' auf null gesetzt? Wann ist es zugewiesen oder wenn "del" abgemeldet ist? – nozzleman

+0

Wenn del abgemeldet ist. – user3736648

Antwort

1
public void RemoveRaiseCustomEventDelegate(Delegate del, string eventName) 
{ 
    this.GetType() 
     .GetEvent(eventName) 
     .RemoveEventHandler(this, del); 
} 

MSDN auf GetEvent

MSDN auf EventInfo.RemoveEventHandler

+1

Um die Qualität dieser Antwort zu verbessern, wäre es schön, wenn Sie ein paar Zeilen Erklärungen hinzufügen. – TaW

+0

GetEvent - https://msdn.microsoft.com/en-us/library/wh463yz3(v=vs.110).aspx RemoveEventHandler - https://msdn.microsoft.com/de-de/library/system.reflection .eventinfo.removeeventhandler (v = vs.110) .aspx –

+0

Ich habe Ihre Links zur Antwort hinzugefügt (und korrigiert). Kommentare sind Bürger zweiter Klasse in SO; Es sind die Antworten (und Fragen), die verbessert werden sollten, um den Wert von SO als Archiv zu erhöhen. – TaW

0

Von dem, was ich sehe RaiseCustomEvent wird nicht in RemoveRaiseCustomEventDelegate gefunden werden. Es ist public deklariert und Sie filtern BindingFlags.NonPublic.

var fieldValue = field.GetValue(this) as EventHandler<CustomEventArgs>; 

sollte daher fehlschlagen. Vielleicht ist RemoveRaiseCustomEventDelegate in einem catch-Block?

+0

Der Code schlägt nicht fehl. Sowohl die field- als auch die fieldValue-Variablen haben einen Wert, der nicht null ist. Nachdem del gelöscht wurde, wird der fieldValue auf null gesetzt. – user3736648

Verwandte Themen