2

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

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

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

4

4 回答 4

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。如果您想防止这种情况,您必须保存属性的原始值(或它们的散列),以便在属性设置器中进行比较。

于 2012-04-23T13:25:28.183 回答
2
  • http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx这是处理数据绑定的标准方式。

  • 在您只想检测与上次具有实际不同值的属性的情况下,每次进行更新时都需要将每个属性的状态保存为“旧”值 - 例如,如果您不想要某个属性自上次更新以来,从 5 变为 3 到 7 又变为 5。

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

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

于 2012-04-23T13:30:21.317 回答
1

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

于 2012-04-23T13:26:16.270 回答
0

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

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

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

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

于 2012-04-23T13:24:49.150 回答