2010-05-24 5 views
5

Ich habe gerade Clone von ICloneable implementiert und festgestellt, dass auch die Event-Subskriptionen von meiner Quellinstanz gefolgt sind. Gibt es eine gute Möglichkeit, all diese zu klären?Löschen Sie alle Event Subscriptions (Clone verlinkt)

Derzeit verwende ich ein paar dieser Schleifen für jedes Ereignis, das ich alles löschen muss.

foreach (var eventhandler in OnIdChanged.GetInvocationList()) 
{ 
    OnIdChanged -= (ItemEventHandler) eventhandler; 
} 

foreach (var eventhandler in OnNameChanged.GetInvocationList()) 
{ 
    ... 

Dies funktioniert gut, aber überfüllt den Code ein wenig. Meistens besorgt um Event-Dangling.

Antwort

1

Ich glaube, Sie könnten einfach OnIdChanged = null in Ihrem geklonten Objekt setzen.

Nachdem Sie den Klon erstellt haben, rufen Sie einfach die ClearEvents-Methode für den Klon auf.

public class ClonedObject 
{ 
    public event EventHandler OnIdChanged; 
    public event EventHandler OnNameChanged; 

    public void ClearEvents() 
    { 
     OnIdChanged = null; 
     OnNameChanged = null; 
    } 
} 
+0

das hat funktioniert, also markiere ich als Antwort. obwohl ich eine Refactoring nach der Antwort von Randolpho – mattias

+1

@mattias erwäge, habe ich nur Ihre Frage und nicht die Auswirkungen Ihrer Lösung in meiner Antwort. Was Randolpho vorgeschlagen hat, ist wahrscheinlich besser. –

+0

half es kurzfristig noch. Vielen Dank! – mattias

2

Vermutlich, wenn Sie wirklich ein Objekt klonen wollen, man wollte halten diese Ereignisabonnements.

Wenn Sie Objekte klonen, die nicht für Ereignisse abonniert sein sollten, sollten Sie Ihren Code umgestalten. Lassen Sie Ihren Controller oder ähnliche Objekte die Ereignisse mit einem Verweis auf ein dediziertes Datenobjekt abonnieren, und lassen Sie Ihre Datenobjekte diese Daten speichern, ohne auf die Ereignisse Bezug zu nehmen. Klonen Sie die Datenobjekte und fügen Sie sie bei Bedarf in geeignete Controller-Objekte ein.

Letztendlich schlage ich vor, dass Sie das Problem umgehen, indem Sie keine Ereignisse abonnieren, die Sie nicht abonnieren müssen. Betrachte den Problemraum aus einem anderen Blickwinkel.

+1

Ich dachte das Gleiche, wenn ich die Frage lese. Clone() impliziert, dass Sie tatsächlich das Objekt, Ereignisse und alles klonen. –