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

作者:Hello——寻梦者! 时间:2022-08-05 03:40:26 

背景

在很多场景下面我们需要在集合发生变化的时候能够通过一个事件对外进行通知,默认的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事件。

来源:https://www.cnblogs.com/seekdream/p/14453536.html

标签:c#,List
0
投稿

猜你喜欢

  • Android实现关机重启的方法分享

    2022-11-13 21:32:33
  • SpringData如何通过@Query注解支持JPA语句和原生SQL语句

    2022-08-26 22:07:29
  • java实现仿射密码加密解密

    2022-10-09 04:04:49
  • Java黑盒测试之nextDate函数测试

    2023-02-10 20:31:08
  • 教你怎么在IDEA中创建java多模块项目

    2023-05-28 19:25:58
  • Java 异步线程监听与结果回调及异常捕获总结分析

    2021-10-14 01:23:40
  • Spring Boot与RabbitMQ结合实现延迟队列的示例

    2021-08-31 02:02:01
  • Java web访问localhost报404错误问题的解决方法

    2023-07-27 05:28:55
  • Android Studio Menu选择菜单的建立方法

    2023-07-28 03:46:31
  • FileStream常用的属性与方法总结

    2023-03-18 17:47:05
  • java序列化对象根据不同配置动态改变属性名的方法

    2022-10-06 11:31:09
  • 一篇文章带你从java字节码层理解i++和++i

    2023-05-29 13:57:58
  • Idea里github的图形化操作配置方法

    2021-12-29 15:03:17
  • Android三种菜单实例分析

    2023-09-09 05:17:20
  • Java 添加和删除PDF图层的示例代码

    2022-09-03 00:29:01
  • 讲解使用Docker搭建Java Web运行环境

    2023-02-05 15:58:12
  • java——多线程基础

    2021-08-08 04:14:25
  • Android5.0新控件实例详解

    2022-12-06 21:58:18
  • android使用DataBinding来设置空状态

    2022-02-06 22:28:35
  • WCF如何使用动态代理精简代码架构

    2023-09-17 16:25:42
  • asp之家 软件编程 m.aspxhome.com