您好,登錄后才能下訂單哦!
怎么在C#項目中實現一個帶通知的List<T>?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
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>的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。