2010-05-24 11 views
5

Właśnie zaimplementowałem Klon z ICloneable i zdałem sobie sprawę, że subskrypcje zdarzeń z mojej instancji źródłowej również zostały zastosowane. Czy istnieje dobry sposób na wyczyszczenie tych wszystkich?Wyczyść wszystkie subskrypcje zdarzeń (Clone Link)

Obecnie używam kilku takich pętli na każde wydarzenie, które muszę wyczyścić.

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

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

Działa to dobrze, ale nieco koduje. Głównie zmartwiony, by wydostać się z wydarzenia.

Odpowiedz

1

Myślę, że można ustawić OnIdChanged = null w sklonowanym obiekcie.

Po utworzeniu klonu wystarczy wywołać metodę ClearEvents na klonie.

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

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

to działało, więc zaznaczam to jako odpowiedź. chociaż rozważam refaktoryzację po odpowiedzi od Randolpho – mattias

+1

@mattias, właśnie rozważałem twoje pytanie, a nie implikację twojego rozwiązania w mojej odpowiedzi. To, co sugerował Randolpho, jest prawdopodobnie lepsze. –

+0

to pomogło na krótką metę. dzięki! – mattias

2

Można przypuszczać, że jeśli naprawdę chce sklonować obiekt, chciałeś zachować te zapisy zdarzeń.

Jeśli klonujesz obiekty, które nie powinny być subskrybowane przez zdarzenia, wydaje się, że powinieneś rozważyć refaktoryzację swojego kodu. Czy twój kontroler lub podobne obiekty subskrybują zdarzenia z odniesieniem do dedykowanego obiektu danych i czy obiekty danych przechowują te dane bez odwoływania się do zdarzeń; sklonuj obiekty danych i umieść je w odpowiednich obiektach kontrolera, jeśli to konieczne.

Sugeruję, aby rozwiązać ten problem, nie subskrybując wydarzeń, do których nie trzeba subskrybować. Spójrz na przestrzeń problemu pod innym kątem.

+1

Myślałem o tym samym, gdy czytałem pytanie. Clone() oznacza, że ​​rzeczywiście klonujesz obiekt, zdarzenia i wszystko. –