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

时间:2021-05-19

背景

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

实现

  这里贴出具体的代码实现

using System;using System.Collections.Generic;using System.Linq;namespace XXX.XXX.Core.Utils{ public class ItemsChangedEventArgs<T> : EventArgs { public IList<T> RemovedItems { get; private set; } public IList<T> AddedItems { get; private set; } public ItemsChangedEventArgs(IList<T> removedItems, IList<T> addItems) { RemovedItems = removedItems; AddedItems = addItems; } } public delegate void ListItemsChangedEventHandler<T>(object sender, ItemsChangedEventArgs<T> args); public class NotifyList<T> : List<T> { public static NotifyList<T> Empty { get { return new NotifyList<T>(); } } public event ListItemsChangedEventHandler<T> ItemsChanged; protected void OnItemsChanged(IList<T> removedItems, IList<T> addedItems) { ListItemsChangedEventHandler<T> temp = ItemsChanged; temp?.Invoke(this, new ItemsChangedEventArgs<T>(removedItems, addedItems)); } public new void Add(T item) { base.Add(item); OnItemsChanged(Empty, new List<T> { item }); } public new void AddRange(IEnumerable<T> 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<T> { item }, Empty); return ret; } public new int RemoveAll(Predicate<T> match) { IList<T> 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<T> { removedItem }, Empty); } public new void RemoveRange(int index, int count) { IEnumerable<T> range = this.Skip(index + 1).Take(count); base.RemoveRange(index, count); OnItemsChanged(range.ToList(), Empty); } }}

注意事项

  1 基类中Add这些方法都是非虚方法,这里不能使用重载,所以在自己实现的每一个方法中需要使用 new 关键字进行覆盖。

2 在具体使用的时候需要订阅ItemsChanged事件。

以上就是C# 如何实现一个带通知的List<T>的详细内容,更多关于C# 实现一个带通知的List<T>的资料请关注其它相关文章!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章