如何通过 C# 实现对象的变更跟踪 ?

咨询区

  • user137348

我有一个类包含五个属性,如果任何一个属性被改变,我希望这个类中的另一个属性(IsDirty)会被自动变更,比如下面的类。

public class Class1
{bool IsDIrty {get;set;}string Prop1 {get;set;}string Prop2 {get;set;}string Prop3 {get;set;}string Prop4 {get;set;}string Prop5 {get;set;}
}

回答区

  • Shimmy Weitzhandler

在 .NET Standard 2.0 中已经提供了 IChangeTrackingIRevertibleChangeTracking 接口可以帮助你实现对象的变更跟踪,接口实现如下:

  1. IChangeTracking

class Entity : IChangeTracking
{string _FirstName;public string FirstName{get => _FirstName;set{if (_FirstName != value){_FirstName = value;IsChanged = true;}}}string _LastName;public string LastName{get => _LastName;set{if (_LastName != value){_LastName = value;IsChanged = true;}}}public bool IsChanged { get; private set; }    public void AcceptChanges() => IsChanged = false;
}
  1. IRevertibleChangeTracking

class Entity : IRevertibleChangeTracking
{Dictionary<string, object> _Values = new Dictionary<string, object>();string _FirstName;public string FirstName{get => _FirstName;set{if (_FirstName != value){if (!_Values.ContainsKey(nameof(FirstName)))_Values[nameof(FirstName)] = _FirstName;_FirstName = value;IsChanged = true;}}}string _LastName;public string LastName{get => _LastName;set{if (_LastName != value){if (!_Values.ContainsKey(nameof(LastName)))_Values[nameof(LastName)] = _LastName;_LastName = value;IsChanged = true;}}}public bool IsChanged { get; private set; }public void RejectChanges(){foreach (var property in _Values)GetType().GetRuntimeProperty(property.Key).SetValue(this, property.Value);AcceptChanges();}public void AcceptChanges(){_Values.Clear();IsChanged = false;}
}

可以看到,上面这种方式是可以实现的,但需要人工一行一行的键入,如何字段特别多的话,工作量还是非常大的,作为另一个选择,我建议你使用 TrackerDog 这样的开源工具包,它可以帮你一键生成模板,你只需要提供 POCO 类即可。

点评区

这种类属性的变更通知,我记得 WPF 中就提供了 INotifyPropertyChanged 接口来实现这种 MVVM 的双向绑定,确实这也是一个非常实用的特性,学习了。

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

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

相关文章

IDA64 Fatal error before kernel init

http://www.tuicool.com/articles/7FZVZna 第一次看到这个错误还以为是修改文件导致的&#xff0c;但是觉得又不大像&#xff0c;因为在Win7底下是完全正常的。搜索了一下才发现是由于插件导致的&#xff1a; NOTE3: You get a “Fatal error before kernel init” when trying…

Linux 释放缓存的方法

echo "3" > /proc/sys/vm/drop_caches数字的作用0 – 不释放1 – 释放页缓存2 – 释放dentries和inodes3 – 释放所有缓存可以加到定时任务里&#xff0c;凌晨5点执行回收。0 5 * * * sync && echo "3" > /proc/sys/vm/drop_caches转载于:ht…

Android安全与逆向之在ubuntu上面搭建NDK环境

1、下载Android NDK自解压包&#xff0c; 官方地址&#xff1a;https://developer.android.com/ndk/downloads/index.html#download下载&#xff1a;$ wget -c http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin 2、解压&#xff0c; 将Android NDK压缩包…

C# 泛型多种参数类型与多重约束 示例

C# 泛型多种参数类型与多重约束 示例 interface IMyInterface { }class Dictionary<TKey, TVal>where TKey : IComparable, IEnumerablewhere TVal : IMyInterface {public void Add(TKey key, TVal val){} }转载于:https://www.cnblogs.com/EasyInvoice/p/5955216.html

简述python解释器的作用_什么是python解释器?

当我们编写Python代码时&#xff0c;我们得到的是一个包含Python代码的以.py为扩展名的文本文件。要运行代码&#xff0c;就需要Python解释器去执行.py文件。 由于整个Python语言从规范到解释器都是开源的&#xff0c;所以理论上&#xff0c;只要水平够高&#xff0c;任何人都可…

和我一起来分析某药品仓储管理系统 卡死现象

一&#xff1a;背景 1. 讲故事这个月初&#xff0c;有位朋友wx上找到我&#xff0c;说他的api过一段时间后&#xff0c;就会出现只有请求&#xff0c;没有响应的情况&#xff0c;截图如下&#xff1a;从朋友的描述中看样子程序是被什么东西卡住了&#xff0c;这种卡死的问题解决…

Java代码总结【1】_查询手机号码归属地

这段代码是查询指定手机号的代码归属地&#xff0c;输出格式为【省份运营商】public static String checkMobilePlace(String mobilephone)throws IOException {//检测手机号码归属地URL url new URL("http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel" …

linux top 命令---VIRT,RES,SHR,虚拟内存和物理内存(

VIRT,RES,SHR,虚拟内存和物理内存(转) VIRT&#xff1a; 1、进程“需要的”虚拟内存大小&#xff0c;包括进程使用的库、代码、数据&#xff0c;以及malloc、new分配的堆空间和分配的栈空间等&#xff1b; 2、假如进程新申请10MB的内存&#xff0c;但实际只使用了1MB&#xff0…

第五十三篇、OC利用AFN上传视频到服务器

整体思路已经清楚&#xff0c;拿到视频资源&#xff0c;先转为mp4&#xff0c;写进沙盒&#xff0c;然后上传&#xff0c;上传成功后删除沙盒中的文件。 本地拍摄的视频&#xff0c;上传到服务器&#xff1a; //视频转换为MP4//转码操作..._hud.mode MBProgressHUDModeIndeter…

sqlite数据库备份还原、导出导入

1、备份和还原数据库 sqlite> .backup backup.db sqlite> .restore backup.db 2、导出及导入SQL脚本 shell方式&#xff1a; # sqlite3 sqa.db ".dump [mytabl%]" > sqa.sql # sqlite3 sqb.db < sqa.sql 命令行方式&#xff1a; sqlite> .output b…

python程序题斐波那契数列_Python_经典题_斐波那契数列

古典问题&#xff1a;3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月兔子总数是多少&#xff1f;&#xff08;使用循环实现&#xff09; 分析&#xff1a; 第一个月是1对 第二个月还是1对 第三个…

SQLite数据库损坏与修复

&#xfeff;&#xfeff;导致SQLite数据库损坏的情况 导致SQLite数据库损坏的情况大致可归结为4类&#xff1a;文件覆盖问题、文件锁问题、数据同步问题、内存问题文件覆盖问题 SQLite数据库文件被覆盖是可能的&#xff0c;毕竟是一个普通的磁盘文件&#xff0c;意味着所有的…

如何定位Source Generators性能问题

前言在以前的文章中&#xff0c;我们介绍过如何调试Source Generators。但是当实现较为复杂时&#xff0c;我们需要能够快速地分析Source Generators性能的方法。默认情况下&#xff0c;使用VS 2019自带的“性能探查器”不能分析Source Generators项目&#xff0c;因为它是类库…

什么是域(domain)

在今天很多人都有意识或无意识的跟域这个东西打过交道。如果你在公司里使用电脑&#xff0c;并且你的电脑接入了公司的局域网&#xff0c;那你的电脑很可能就在一个域中。如何查看你的电脑是否连接到一个域中&#xff0c;以Windows为例&#xff0c;右击我的电脑 –>属性&…

四舍五入运算

为什么80%的码农都做不了架构师&#xff1f;>>> 请用户输入1个实数(浮点型),请编写算法对这个实数进行四舍五入到个位的运算. 例如 12.56经过四舍五入运算得到13. 而12.45经过四舍五入运算得到12 代码如下地址: http://git.oschina.net/touch1D/qf17j3eughwdp8zxi…

python 新建html_Python学习第226课——html中创建按钮

前面我们学习了一些常见的表单元素&#xff0c;表单就是用来收集用户的信息的&#xff0c;比如调查问卷、用户登录网站的页面等这类的网页&#xff0c;里面都要用到表单元素&#xff0c;当用户在前端页面上填入账号、密码、或者调查问卷的答案等等信息之后&#xff0c;就需要提…

Linux之软连接和硬链接

&#xfeff;&#xfeff;1.Linux链接概念 Linux链接分两种&#xff0c;一种被称为硬链接&#xff08;Hard Link&#xff09;&#xff0c;另一种被称为符号链接&#xff08;Symbolic Link&#xff09;。默认情况下&#xff0c;ln命令产生硬链接。 【硬连接】 硬连接指通过索引…

WPF 实现图片切成九宫格控件~

WPF开发者QQ群&#xff1a; 340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着上一篇倒计时控件01—代码如下一、创建 CropControl.cs代码如下。&#xff08;修改RowColumn “…