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

时间:2012-04-23 13:11:53

标签: c#

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

我需要知道自上次更新以来哪些属性已更改,因此我可以记录更改。我可以通过保留先前更新中的POCO副本并每次执行比较然后为每个属性更改触发事件来完成此操作。

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

4 个答案:

答案 0 :(得分:2)

如果它真的是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。如果要防止出现这种情况,则必须保存属性设置器中要比较的属性(或其哈希值)的原始值。

答案 1 :(得分:2)

  • http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx这是与数据绑定相关的标准方法。

  • 在您只想检测实际上与上次不同的值的属性时,每次进行更新时都需要将每个属性的状态保存为“旧”值 - 例如,如果您自上次更新以来,不希望将属性从5更改为3到7回到5.

  • 如果你不关心这种区别,并且不想使用propertychanged,你可以给每个属性一个bool值,你在setter中设置为true,并在每次你设置为false时更新

  • 您可以创建一个GetProperty / SetProperty机制 - 您可以在setter / getters中调用这些函数,然后您可以以任何您想要的方式保存实际数据及其中的任何元数据。然而,这不再是POCO了。

答案 2 :(得分:0)

据我所知,.NET没有“内置”跟踪类的任何属性更改。但是,以下任何一项都应该有效:

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

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

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

答案 3 :(得分:0)

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