C#监听Dictionary、List的写入操作

前言

在开发中,对于内置值类型和string我们可以通过封装属性在Set中监听写入操作,但是对于DictionaryList等就不能监听到AddRemove等写入操作。
所以一般采取两种方式监听它们的读写操作,一种是封装操作方法,间接进行监听,第二种就是重写AddRemove等方法。下面介绍第二种方法。

实现

下面是重写了Dictionary的示例,List同理。

using System;
using System.Collections.Generic;// 定义一个委托类型,用于处理字典变化的事件
public delegate void DictionaryChangedEventHandler<TKey, TValue>(object sender, DictionaryChangedEventArgs<TKey, TValue> e);// 定义一个事件参数类,用于封装字典变化的信息
public class DictionaryChangedEventArgs<TKey, TValue> : EventArgs
{// 变化的类型,可以是Add, Remove, Update或Clearpublic DictionaryChangedType ChangeType { get; set; }// 变化的键public TKey Key { get; set; }// 变化的值public TValue Value { get; set; }// 构造函数public DictionaryChangedEventArgs(DictionaryChangedType changeType, TKey key, TValue value){ChangeType = changeType;Key = key;Value = value;}
}// 定义一个枚举类型,用于表示字典变化的类型
public enum DictionaryChangedType
{Init,Add,Remove,Update,Clear,
}// 定义一个继承自Dictionary<TKey,TValue>的类,用于触发字典变化的事件
public class ObservableDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{// 定义一个构造函数,用于接受一个IDictionary<TKey, TValue>类型的参数public ObservableDictionary(IDictionary<TKey, TValue> dictionary){base.Clear();foreach (var item in dictionary){base.Add(item.Key, item.Value);}OnDictionaryChanged(new DictionaryChangedEventArgs<TKey, TValue>(DictionaryChangedType.Init, default, default));}public ObservableDictionary(){OnDictionaryChanged(new DictionaryChangedEventArgs<TKey, TValue>(DictionaryChangedType.Init, default, default));}// 定义一个事件,用于通知字典变化public event DictionaryChangedEventHandler<TKey, TValue> DictionaryChanged;// 重写Add方法,用于在添加元素时触发事件public new void Add(TKey key, TValue value){base.Add(key, value);OnDictionaryChanged(new DictionaryChangedEventArgs<TKey, TValue>(DictionaryChangedType.Add, key, value));}// 重写Remove方法,用于在删除元素时触发事件public new bool Remove(TKey key){if (base.TryGetValue(key, out TValue value)){base.Remove(key);OnDictionaryChanged(new DictionaryChangedEventArgs<TKey, TValue>(DictionaryChangedType.Remove, key, value));return true;}return false;}// 重写索引器,用于在更新元素时触发事件public new TValue this[TKey key]{get => base[key];set{if (base.ContainsKey(key)){base[key] = value;OnDictionaryChanged(new DictionaryChangedEventArgs<TKey, TValue>(DictionaryChangedType.Update, key, value));}else{Add(key, value);}}}// 重写Clear方法,用于在清空字典时触发事件public new void Clear(){base.Clear();OnDictionaryChanged(new DictionaryChangedEventArgs<TKey, TValue>(DictionaryChangedType.Clear, default, default));}// 定义一个虚方法,用于触发事件protected virtual void OnDictionaryChanged(DictionaryChangedEventArgs<TKey, TValue> e){DictionaryChanged?.Invoke(this, e);}public void ResetSubscriptions(){DictionaryChanged = null;}
}

使用示例

    public void Test(){// 创建一个ObservableDictionary实例var dict = new ObservableDictionary<string, int>();// 注册事件处理程序,用于输出字典变化的信息dict.DictionaryChanged += (sender, e) =>{Debug.Log($"ChangeType: {e.ChangeType}, Key: {e.Key}, Value: {e.Value}");};// 添加元素dict.Add("a", 1);dict.Add("b", 2);// 删除元素dict.Remove("a");// 更新元素dict["b"] = 3;dict["c"] = 4;Dictionary<string, int> newDic = new Dictionary<string, int>{{ "acd", 120 }};Debug.LogError(((ObservableDictionary<string, int>)newDic).Count);var newDic1 = new ObservableDictionary<string, int>(newDic);Debug.LogError(newDic1.Count);// 清空字典dict.Clear();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Py/Java/C++三种语言详解】LeetCode每日一题240113【贪心】LeetCode2182、构建限制重复的字符串

文章目录 题目链接题目描述解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目链接 LeetCode2182、构建限制重复的字符串 题目描述 给你一个字符串 s 和一个整数 repeatLimit &#xff0c;用 s 中的字符构造一个新字符串 repeatLimitedStri…

(南京观海微电子)——色温介绍

色温是表示光线中包含颜色成分的一个计量单位。从理论上说&#xff0c;黑体温度指绝对黑体从绝对零度&#xff08;&#xff0d;273℃&#xff09;开始加温后所呈现的颜色。黑体在受热后&#xff0c;逐渐由黑变红&#xff0c;转黄&#xff0c;发白&#xff0c;最后发出蓝色光。当…

im6ull学习总结(三-五)freetype显示正行字

知识补充 笛卡尔坐标系 这里笛卡尔坐标系就是初高中学的直角坐标系的第一象限 lcd坐标系则不同 这两个坐标系如何转换 观察两个坐标系 点&#xff08;x,y&#xff09;的x坐标在两个坐标系中相同&#xff0c;纵坐标&#xff08;y&#xff09;存在着yV-yV V是整个屏幕的行数的像…

MYSQL的操作

1.库的操作 1.1创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 说明&#xff1a; #…

python flask学生管理系统

预览 前端 jquery css html bootstrap: 4.x 后端 python: 3.6.x flask: 2.0.x 数据库 mysql: 5.7 学生管理模块 登录、退出查看个人信息、修改个人信息成绩查询查看已选课程选课、取消选课搜索课程课程列表分页功能 教师模块 登录、退出查看个人信息、修改个人信息录入…

leetcode 每日一题 2024年01月14日 删除排序链表中的重复元素

题目 83. 删除排序链表中的重复元素 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&#xff…

解决Unexpected record signature 0X9maven 资源过滤

解决Unexpected record signature: 0X9|maven 资源过滤 记录问题&#xff1a;我们有个需求是根据excel模版导出一个excel表。我们的项目是SpringBoot&#xff0c;所以理所当然的把这个模版文件放到了&#xff0c;resources文件夹中。但是在导出文件的时候却遇到了invalid code …

二极管限幅电路理论分析,工作原理+作用

一、限幅是什么意思&#xff1f; 限幅也就是&#xff0c;将电压限制在某个范围内&#xff0c;去除交流信号的一部分但不会对波形的剩余部分造成影响。通常来说&#xff0c;限幅电路主要是由二极管构成&#xff0c;波形的形状取决于电路的配置和设计。二、限幅电路工作原…

场效应管在电路中如何控制电流大小

场效应管的概念 场效应晶体管&#xff08;FieldEffectTransistor缩写&#xff08;FET&#xff09;&#xff09;简称场效应管。主要有两种类型&#xff08;juncTIonFET—JFET&#xff09;和金属-氧化物半导体场效应管&#xff08;metal-oxidesemiconductorFET&#xff0c;简称M…

9.5.1 函数模板特化

函数模板 有了泛化版本比较函数&#xff0c;我们可以比较两个整数&#xff0c;两个字符&#xff0c;两个指针 6~10行&#xff0c;是一个函数模板 13~16行&#xff0c;都可以得到正常结果 22行&#xff0c;得到的结果是&#xff0c;"A001" < "A000", …

【k8s】Kubernetes 声明式 API、命令式

1. 资源管理方式&#xff1a; 1>. 命令式对象管理∶直接使用命令去操作kubernetes资源 kubectl run nginx-pod --imagenginx:1.17.1 --port802>. 命令式对象配置∶通过命令配置和配置文件去操作kubernetes资源 kubectl create/patch -f nginx-pod.yaml3>. 声明式对…

【OpenGauss源码学习 —— 执行器(execMain)】

执行器&#xff08;execMain&#xff09; 概述文件内容作用执行的操作主要函数概述 部分函数详细分析ExecutorStart 函数standard_ExecutorStart 函数 ExecutorRun 函数standard_ExecutorRun 函数 ExecutorFinish 函数standard_ExecutorFinish 函数 ExecutorEnd 函数standard_E…

京东宣布启动鸿蒙原生应用开发,全力支持鸿蒙生态 | 百能云芯

华为常务董事、终端BG CEO、智能汽车解决方案BU董事长余承东于1月10日在微博上发布了一条令人振奋的消息&#xff1a;京东即将启动鸿蒙原生应用的开发。这一消息在科技圈掀起了不小的波澜&#xff0c;也为鸿蒙系统的发展注入了新的动力。 京东集团首席执行官兼执行董事许冉和余…

SpringBoot读取配置文件中的内容

文章目录 1. 读取配置文件application.yml中内容的方法1.1 Environment1.2 Value注解1.3 ConfigurationProperties 注解1.4 PropertySources 注解&#xff0c;获取自定义配置文件中的内容&#xff0c;yml文件需要自行实现适配器1.5 YamlPropertiesFactoryBean 加载 YAML 文件1.…

集成开发环境(IDE)介绍

集成开发环境&#xff08;IDE&#xff09;介绍 集成开发环境&#xff08;Integrated Development Environment&#xff0c;IDE&#xff09;是一种软件应用程序&#xff0c;用于开发和编写软件。常见的IDE包括Eclipse、Visual Studio、IntelliJ IDEA、Qt Creator等。 集成开发环…

xcode-docC

docC(documentaion compiler) docC分为三种类型&#xff1a;articles,tutorials articles 文章介绍类型 tutorials 教程 讲解api的使用流程 苹果官方视频

SpringBoot知识03

1、多模块项目无法启动&#xff0c;报错Failed to execute goal on project*: Could not resolve dependencies for project

强化学习应用(七):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

软件外包资源网站分享

经济不景气导致很多人失业&#xff0c;能否找到一份工作或找些项目做做&#xff0c;这里列了一些国内和国外的资源网上&#xff0c;希望对大家有益&#xff1a; 国内篇&#xff1a; 软件项目交易网&#xff1a;(软件项目交易网)这是一个专注于软件开发需求的外包平台&#xf…

【DP】712. 两个字符串的最小ASCII删除和

题目 与583. 两个字符串的删除操作题目几乎一模一样&#xff01; 法1&#xff1a;DP class Solution {public int minimumDeleteSum(String s1, String s2) {int m s1.length() 1, n s2.length() 1;int[][] dp new int[m][n];for (int i 1; i < n; i) { // 首行dp[0…