这篇文章主要介绍了C# 如何实现一个带通知的List,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
背景
在很多场景下面我们需要在集合发生变化的时候能够通过一个事件对外进行通知,默认的List
实现
这里贴出具体的代码实现
using System; using System.Collections.Generic; using System.Linq; namespace XXX.XXX.Core.Utils { public class ItemsChangedEventArgs: EventArgs { public IList RemovedItems { get; private set; } public IList AddedItems { get; private set; } public ItemsChangedEventArgs(IList removedItems, IList addItems) { RemovedItems = removedItems; AddedItems = addItems; } } public delegate void ListItemsChangedEventHandler (object sender, ItemsChangedEventArgs args); public class NotifyList : List { public static NotifyList Empty { get { return new NotifyList (); } } public event ListItemsChangedEventHandler ItemsChanged; protected void OnItemsChanged(IList removedItems, IList addedItems) { ListItemsChangedEventHandler temp = ItemsChanged; temp?.Invoke(this, new ItemsChangedEventArgs (removedItems, addedItems)); } public new void Add(T item) { base.Add(item); OnItemsChanged(Empty, new List { item }); } public new void AddRange(IEnumerable collection) { base.AddRange(collection); OnItemsChanged(Empty, collection.ToList()); } public new void Clear() { T[] array = new T[this.Count]; this.CopyTo(array); base.Clear(); OnItemsChanged(array.ToList(), Empty); } public new bool Remove(T item) { bool ret = base.Remove(item); if (ret) OnItemsChanged(new List { item }, Empty); return ret; } public new int RemoveAll(Predicate match) { IList removedItems = FindAll(match); int count = base.RemoveAll(match); if (removedItems.Count != count) { throw new Exception("[NotifyList][RemoveAll][The number of elements found by the predicate does not match the number of elements removed.]"); } OnItemsChanged(removedItems, Empty); return count; } public new void RemoveAt(int index) { T removedItem = this[index]; base.RemoveAt(index); OnItemsChanged(new List { removedItem }, Empty); } public new void RemoveRange(int index, int count) { IEnumerable range = this.Skip(index + 1).Take(count); base.RemoveRange(index, count); OnItemsChanged(range.ToList(), Empty); } } }
注意事项
1 基类中Add这些方法都是非虚方法,这里不能使用重载,所以在自己实现的每一个方法中需要使用 new 关键字进行覆盖。
2 在具体使用的时候需要订阅ItemsChanged事件。
以上就是C# 如何实现一个带通知的List
以上就是C# 如何实现一个带通知的List