2010-05-24 13 views
5

ICONeable'dan Clone'u uyguladıktan sonra kaynak örneğimden gelen olay abonelikleri de takip ettim. Bunları temizlemek için iyi bir yol var mı?Tüm Olay aboneliklerini temizle (Klonla bağlanmış)

Şu anda her olayı temizlemek zorunda olduğum her olay için bir çift bu döngüyü kullanıyorum.

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

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

Bu, iyi çalışıyor ancak kodu biraz karıştırıyor. Olay sarkması için çoğunlukla endişelendim.

cevap

1

Klonlanan nesnenize OnIdChanged = null'u ayarlayabileceğinizi düşünüyorum.

Klonu oluşturduktan sonra, klondaki ClearEvents yöntemini çağırmanız yeterlidir. Eğer gerçekten bir nesneyi klonlamak istiyorsa

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

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

Bu işe yaradı, bu yüzden işaretleme bir cevaptır. Randolpho – mattias

+1

@ mattias'ın cevabından sonra bir refactoring düşünürsem de, sadece cevabımdaki cevabın değil, sizin sorunuzu dikkate aldım. Randolpho'nun önerdiği, muhtemelen daha iyidir. –

+0

hala kısa vadede yardımcı oldu. Teşekkürler! – mattias

2

Tahminen, sen istedi bu olay aboneliklerini tutun.

Olaylara abone olmaması gereken nesneleri klonlıyorsanız, kodunuzu tekrar gözden geçirmeyi düşünmeniz gerekir. Denetleyicinizin veya benzer nesnelerin, olayları özel bir veri nesnesine referansla abone olmasını ve veri nesnelerini, olayları referans almadan bu verileri depolamasını sağlayın; Veri nesnelerini klonlayın ve gerektiğinde uygun kontrolör nesnelerine yerleştirin.

Nihayetinde, abone olmanıza gerek olmayan etkinliklere abone olmamanız nedeniyle sorunu çözmenizi öneriyorum. Problem boşluğuna farklı bir açıdan bakın.

+1

Soruyu okurken aynı şeyi düşündüm. Clone() gerçekten nesneyi, olayları ve tümünü klonladığınızı gösterir. –