C#和ASP.NET自定义属性并确定属性是否更改

C#和ASP.NET自定义属性并确定属性是否更改,c#,asp.net,custom-attributes,change-tracking,C#,Asp.net,Custom Attributes,Change Tracking,我正在做一个项目,我们想保存一个特定对象的历史记录。保存时,我需要对象上的一个方法,该方法将确定对象是否已更改,以便调用一个方法将其当前状态保存到历史。例如,我从用户进行更改(或可能不进行更改)并提交表单的对象填充表单。我想获取我的原始对象和该对象的副本,该对象已从表单中更新,并确定它是否已更改。此外,我可能会在某个时候决定某些属性不重要(例如,如果名称更改,我不会跟踪它) 我认为实现这一点的最简单/最灵活的方法是,如果我可以给我关心的属性一个自定义属性[ChangeTracked],然后我可以

我正在做一个项目,我们想保存一个特定对象的历史记录。保存时,我需要对象上的一个方法,该方法将确定对象是否已更改,以便调用一个方法将其当前状态保存到历史。例如,我从用户进行更改(或可能不进行更改)并提交表单的对象填充表单。我想获取我的原始对象和该对象的副本,该对象已从表单中更新,并确定它是否已更改。此外,我可能会在某个时候决定某些属性不重要(例如,如果名称更改,我不会跟踪它)

我认为实现这一点的最简单/最灵活的方法是,如果我可以给我关心的属性一个自定义属性[ChangeTracked],然后我可以使用反射来获取具有该属性的所有属性的列表,并通过比较a.property==B.property来确定是否有任何属性发生了更改


这样行吗?是否有更好/更简单的方法来处理此问题,例如可以添加到对象中的某种内置方法来确定任何属性的值是否已更改?无论解决方案是什么,一些psudo代码都将受到赞赏。作为澄清的一点,解决方案需要确定我关心的值是否实际发生了变化,而不仅仅是它在创建后是否已被分配,即如果我设置Name=“bob”并且它已经是“bob”在分配之前,这不算作更改。

一种可能的方法是在加载对象时将对象的深度副本添加为对象的私有属性。()


保存时,您可以将复制对象与“活动”对象进行比较,以查看是否发生了任何更改。

这并不奇怪,但这是一种经过验证的暴力方法。只需向名为IsDirty的对象添加一个私有属性。对于要跟踪的属性,只需将IsDirty=True添加到属性集例程。对于更复杂的“DoIcare”规则,只需将它们编码到属性集中即可


page按钮的click事件可以触发一个Save事件,该事件将文本框和下拉列表中的所有值写入对象属性,然后调用object Save方法,该方法在执行任何操作之前测试IsDirty属性。

获取副本不是问题。我可以加载一个对象的两个副本并从表单中更新一个副本。我想要的是一种简单的方法来确定这两个对象是否不再相等。我可以创建一个自定义方法来执行此操作a.IsDifferentt与(B)不同,后者将手动检查我关心的属性,但我必须记住在添加新属性时更新它。如果在添加新属性“[ChangeTracked]LastName{get;set;}”时,我的方法会自动检查新属性和以前的属性,这会更容易。我是不是误解了你的解决方案?这肯定行得通。只有我关心的属性修改IsDirty标志可以解决这个问题。我不知道为什么,但在我看来,这并不像我提出的自定义属性/反射方法那样优雅。我正在努力成为一名更好的程序员,尽可能地以“正确的方式”做事,而不是快速而肮脏的方式。也许在这种情况下,我太聪明了,不利于我自己。@William:使用反射来减少程序员的工作量很少是个好主意。属性的setter中的反射将不必要地降低性能。