Очистить все подписки на события (клонированный) - PullRequest
5 голосов
/ 24 мая 2010

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 24 мая 2010

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

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

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

2 голосов
/ 24 мая 2010

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

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

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

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