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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值