public void Clear() { var itemsWhichCanNotBeRemoved = new List <T>(); var beforeHandler = Volatile.Read(ref ItemRemoving); foreach (var item in this) { if (beforeHandler != null) { var eventArgs = new CancelableItemEventArgs <T>(item); beforeHandler(this, eventArgs); if (eventArgs.IsCanceled) { itemsWhichCanNotBeRemoved.Add(item); } } } if (itemsWhichCanNotBeRemoved.Count == 0) { var copy = new List <T>(this); ClearImplementation(); var afterHandler = Volatile.Read(ref ItemRemoved); foreach (var item in copy) { afterHandler?.Invoke(this, new ItemEventArgs <T>(item)); } } else { throw new ItemsCantBeRemovedException <T>(itemsWhichCanNotBeRemoved); } }
public void Add(T item) { var beforeHandler = Volatile.Read(ref ItemAdding); if (beforeHandler != null) { var eventArgs = new CancelableItemEventArgs <T>(item); beforeHandler(this, eventArgs); if (eventArgs.IsCanceled) { return; } } AddImplementation(item); Volatile.Read(ref ItemAdded)?.Invoke(this, new ItemEventArgs <T>(item)); }
public Boolean Remove(T item) { var beforeHandler = Volatile.Read(ref ItemRemoving); if (beforeHandler != null) { var eventArgs = new CancelableItemEventArgs <T>(item); beforeHandler(this, eventArgs); if (eventArgs.IsCanceled) { return(false); } } Boolean result = RemoveImplementation(item); Volatile.Read(ref ItemRemoved)?.Invoke(this, new ItemEventArgs <T>(item)); return(result); }