如何检查对象是否发生变化?我有一个包含其他对象的对象,该对象包含其他对象,包括列表等。该对象是绑定到表单的数据,在不同的选项卡中向用户公开多个字段。我还使用了主子数据网格视图。知道如何检查此对象中的任何内容是否相对于较早的时刻发生了变化吗?不要(手动)添加更改的变量,在所有(>100)设置方法中设置为true。您如何定义“平等”(旧州和新州之间)?如果这些问题的答案足够笼统(即你可以设计出一套适用于所有对象的规则),那么理论上你可以通过反思来完成你想要的:基本思想是阅读“所有属性/字段的“root”对象,然后存储“primefaces”对象并递归下降到“non-primefaces”对象(并重复整个过程)。稍后,当你想检查是否有任何变化时,你将重复递归下降和将结果与存储的值进行比较。我不认为这个解决方案特别有效甚至简单(你需要设计一个强大的命名约定来存储旧值并且非常小心多线程),但它可能是一般。正如Sll所说,脏接口绝对是一个好方法。此外,我们希望集合是脏的,但我们不想将所有子对象都设置为脏。但是,我们可以做的是结合结果将它们的脏状态与我们自己的脏状态结合起来。由于我们使用的是接口,因此我们将其留给对象来确定它们是否脏。我的解决方案不会告诉你什么是脏的,只是告诉你任何对象的状态在任何时候都是脏的。公共接口IDirty{boolIsDirty{get;}}//eo接口IDirtypublicclassSomeObject:IDirty{privatestringname_;私人布尔脏_;公共字符串名称{获取{返回名称_;}设置{名称_=值;脏_=真;}}publicboolIsDirty{get{returndirty_;}}}//eoclassSomeObjectpublicclassSomeObjectWithChildren:IDirty{privateintaverageGrades_;私人布尔脏_;私有列表children_=newList();publicboolIsDirty{get{boolret=dirty_;foreach(IDirtychildinchildren_)dirty_|=child.IsDirty;返还;}}}//eoclassSomeObjectWithChildren你可以实现INotifyPropertyChanged接口,如果你使用VS2010,你可以自动更改IL中的所有属性(所以你不必手动实现)。我敢肯定还有其他使用编织技术的方法。我在vs2010库中找到了该插件:http://visualstudiogallery.msdn.microsoft.com/bd351303-db8c-4771-9b22-5e51524fccd3有一个很好的例子-你的代码:公共字符串GivenNames{得到;放;}}什么编译:publicclassPerson:INotifyPropertyChanged{publiceventPropertyChangedEventHandlerPropertyChanged;私有字符串givenNames;公共字符串GivenNames{get{返回givenNames;}set{ifgi(value)givenNames=value;OnPropertyChanged("GivenNames");OnPropertyChanged("全名");这是来自G的第一次(可能有用):http://justinangel.net/AutomagicallyImplementingINotifyPropertyChangedhttp://www.codeproject.com/KB/WPF/AutonotifyPropertyChange.aspx你可以覆盖GetHashCode然后创建一个混合了对象属性的哈希码。所以你的程序会获取对象的哈希码,存储它,然后在下一次检查时,将它与当前的哈希码进行比较。一个非常简单的方法:internalclassFoo{publicstringBar{get;放;}publicintBaaz{得到;放;}publicoverrideintGetHashCode(){returnBar.GetHashCode()-Baaz.GetHashCode();}}注意,因为你要找到Bar不为null并且还要满足整数溢出。编辑阅读EircLippert的博客后,我同意不得使用GetHashCode。我保留答案以使讨论更加丰富。随着时间的推移比较哈希码可能是一种选择。如果您不想添加该逻辑,您可以将对象序列化两次并比较两个结果字符串的哈希码。编辑以包括一些评论看看这个问题/答案:同一对象的序列化可以产生不同的流吗?因此,请注意不能保证同一对象两次输出相同的序列化程序。我可以采取这样的做法:publicclassObjectBase:INotifyPropertyChanged{publiceventPropertyChangedEventHandlerPropertyChanged;protectedvirtualvoidOnPropertyChanged(stringpropertyName){OnPropertyChanged(propertyName,true);}protectedvirtualvoidOnPropertyChanged(stringpropertyName)make{!=null)PropertyChanged(this,newPropertyChangedEventArgs(propertyName));如果(makeDirty)_IsDirty=true;}布尔_IsDirty;公共布尔IsDirty{得到{返回_IsDirty;然后在属性访问中你可以publicclassVehicle:ObjectBase{int_CarId;publicintCarId{get{return_CarId;}set{if(_CarId!=value){_CarId=value;OnPropertyChanged(名称(CarId));}}}}希望对你有帮助以上是C#走教程:如何检查一个对象是否发生变化?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
