Я просто реализовал Клон от ICloneable и понял что подписки события от моего исходного экземпляра, также сопровождаемого. Существует ли хороший способ очистить все они?
В настоящее время я использую несколько этих циклов для каждого события, я должен очистить все.
foreach (var eventhandler in OnIdChanged.GetInvocationList())
{
OnIdChanged -= (ItemEventHandler) eventhandler;
}
foreach (var eventhandler in OnNameChanged.GetInvocationList())
{
...
Это хорошо работает, но создает помехи коду немного. Главным образом взволнованный получить свисание события.
Думаю, вы могли бы просто установить OnIdChanged = null
в своем клонированном объекте.
После создания клона вы просто вызываете метод ClearEvents
для клона.
public class ClonedObject
{
public event EventHandler OnIdChanged;
public event EventHandler OnNameChanged;
public void ClearEvents()
{
OnIdChanged = null;
OnNameChanged = null;
}
}
Предположительно, если вы действительно хотели клонировать объект, вы хотели сохранить это событие Подписки.
Если вы клонируете объекты, которые не должны подписываться на события, похоже, вам следует подумать о рефакторинге вашего кода. Пусть ваш контроллер или аналогичные объекты подписываются на события со ссылкой на выделенный объект данных, а ваши объекты данных хранят эти данные без ссылки на события; клонируйте объекты данных и при необходимости поместите их в соответствующие объекты контроллера.
В конечном счете, я предлагаю вам обойти эту проблему, не подписываясь на события, на которые вам не нужно подписываться. Взгляните на проблемное пространство под другим углом.