C# 如何实现一个带通知的List

这篇文章主要介绍了C# 如何实现一个带通知的List,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

背景

  在很多场景下面我们需要在集合发生变化的时候能够通过一个事件对外进行通知,默认的List并没有此类功能,所以对于这一类需求的业务场景下我们需要自己进行相关的扩展,这样才能够符合我们这一需求,这里我来列举一个在项目中经常用到的一个扩展类,在后面我们会对这个进行具体的分析和使用到的C#知识点进行关注。

实现

  这里贴出具体的代码实现

 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的资料请关注html中文网其它相关文章!

以上就是C# 如何实现一个带通知的List的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程