检查 POCO 上的属性值是否已更改

本文关键字:是否 属性 POCO 检查 | 更新日期: 2023-09-27 18:32:08

我有一个每N秒更新一次的POCO。我遇到的问题是,自上次更新以来,并非所有属性都已更改。

我需要知道自上次更新以来哪些属性发生了更改,以便我可以记录更改。我可以通过保留上次更新中的 POCO 副本并每次执行比较来做到这一点,然后可能为每个属性更改触发一个事件。

有没有人有更好的解决方案可以在这里使用?

检查 POCO 上的属性值是否已更改

    http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx 这是与
  • 数据绑定配合使用的标准方式。

  • 每次执行更新时,都必须将每个属性的状态保存为"旧"值,因为您只想检测与上次具有实际不同值的属性 - 例如,如果您不希望属性自上次更新以来从 5 更改为 3 到 7 回到 5。

  • 如果您不关心这种区别,并且不想使用 propertyChanged,则可以为每个属性提供一个布尔值,您在 setter 中将其设置为 true,并在每次更新时将它们设置为 false。

  • 您可以创建一个 GetProperty/SetProperty 机制 - 您可以在 setters/getter 中调用这些函数,然后您可以以您想要的任何方式保存实际数据和有关它的任何元数据。然而,这不再是真正的POCO。

如果它真的是 POCO,那么,不,您需要保留一份副本。如果您愿意向 POCO 添加 IsDirty 标志,则可以在更改属性时设置它。您可以将 IsDirty 标志设置为位字段,以便知道更改了哪些属性:

class POCO
{
[Flags]
enum POCOFieldsEnum
{
  Property1 = 0x01;
  Property2 = 0x02;
}
private String _Property1;
public String Property1 
{ 
  get { return _Property1; }
  set 
  { 
    if (value.Equals(_Property1)) return;
    _Property1 = value;
    DirtyFlags |= POCOFieldsEnum.Property1;
  }
}
private String _Property2;
public String Property2
{
  get { return _Property2; }
  set 
  { 
    if (value.Equals(_Property2)) return;
    _Property2 = value;
    DirtyFlags |= POCOFieldsEnum.Property2;
  }
}
POCOFieldsEnum DirtyFlags { private set; public get; }
}

请注意,如果此类对象更改了属性,然后更改回其原始值,则仍会设置 DirtyFlag。如果要防止这种情况,则必须保存属性的原始值(或它们的哈希值),以便在属性资源库中进行比较。

创建各种属性的哈希并将其另存为属性本身,然后在验证时再次比较。

据我所知,.NET 没有任何"内置"功能来跟踪类上的任何属性更改。但是,以下任何一种都应该有效:

1) 在每个属性的 setter 中手动编写代码以跟踪更改。

2)编写一些代码,将"旧"副本与"更新"实例进行比较(与您在原始帖子中所说的相同)。

3)使用AOP框架(如PostSharp)为每个属性添加某种更新通知。