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
投稿
猜你喜欢
Java如何把int类型转换成byte
2023-03-13 11:12:39
详解SpringBoot JPA常用注解的使用方法
2023-12-09 17:10:31
Springboot引入hibernate配置自动建表并进行增删改查操作
2021-08-30 06:17:02
Java SoftReference类案例详解
2023-04-07 06:52:29
JAVA Map架构和API介绍
2023-01-25 14:01:38
JDK13的新特性之AppCDS详解
2023-03-19 10:32:38
Java生成PDF文件的实例代码
2022-05-24 07:22:37
在@Value注解内使用SPEL自定义函数方式
2022-04-26 20:59:41
解析C#彩色图像灰度化算法的实现代码详解
2022-01-26 07:34:55
2022编程语言需求排名出炉:第一不是Python,也不是Java
2023-10-11 19:09:17
java搭建ftp/sftp进行数据传递的全过程
2023-11-29 15:08:10
springboot读取自定义配置文件时出现乱码解决方案
2022-01-29 11:09:40
批处理一键安装JDK/一键安装JRE和自动配置Java环境变量
2023-11-29 05:28:30
Java中的线程生命周期核心概念
2021-10-14 13:37:54
SpringCloud 搭建企业级开发框架之实现多租户多平台短信通知服务(微服务实战)
2022-12-04 13:22:53
C#学习笔记整理_浅谈Math类的方法
2022-04-11 06:16:48
C#的静态工厂方法与构造函数相比有哪些优缺点
2022-08-29 21:11:45
Spring Boot中如何使用Swagger详解
2023-09-27 18:13:58
Android中使用CircleImageView和Cardview制作圆形头像的方法
2022-04-19 05:41:35
详解使用IntelliJ IDEA新建Java Web后端resfulAPI模板
2023-12-14 09:26:04