2010-05-24 1 views
5

Я только что реализовал Clone от ICloneable и понял, что также подписались события из моего исходного экземпляра. Есть ли хороший способ очистить все это?Очистить все подписки на события (Clone linked)

В настоящее время я использую пару этих циклов для каждого события, которое у меня есть, чтобы очистить все.

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

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

Это прекрасно работает, но немного загромождает код. В основном беспокоился о том, что событие свисало.

ответ

1

Я думаю, вы могли бы просто установить OnIdChanged = null в свой клонированный объект.

После того, как вы создали клон, вы просто вызываете метод ClearEvents на клоне.

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

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

Это сработало, поэтому я отмечаю это как ответ. хотя я рассматриваю рефакторинг после ответа от Randolpho – mattias

+1

@mattias, я только что рассмотрел ваш вопрос, а не последствия вашего решения в своем ответе. То, что предложил Рандольфо, вероятно, лучше. –

+0

все еще помогало в краткосрочной перспективе. благодаря! – mattias

2

Предположительно, если вы действительно хотели, чтобы клонировать объект, вы хотите держать эти подписки на события.

Если вы клонируете объекты, которые не должны подписываться на события, вы должны подумать о реорганизации своего кода. Попросите ваш контроллер или подобные объекты подписаться на события со ссылкой на выделенный объект данных и ваши объекты данных хранят эти данные без ссылки на события; клонировать объекты данных и поместить их в соответствующие объекты контроллера по мере необходимости.

В конечном счете, я предлагаю вам решить проблему, не подписываясь на события, на которые вам не нужно подписываться. Посмотрите на проблемное пространство под другим углом.

+1

Я думал то же самое, когда читаю вопрос. Clone() подразумевает, что вы действительно клонируете объект, события и все. –