Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查POCO上的属性值是否已更改_C# - Fatal编程技术网

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

C# 检查POCO上的属性值是否已更改,c#,C#,我有一个每N秒更新一次的POCO。我遇到的问题是,自上次更新以来,并非所有属性都已更改 我需要知道自上次更新以来哪些属性发生了更改,以便记录更改。我可以这样做,从上一次更新中保留一份POCO副本,每次执行比较,然后可能为每次属性更改触发一个事件 有谁有更好的解决方案可以在这里使用吗 据我所知,.NET没有任何“内置”功能来跟踪类的任何属性更改。但是,以下任何一项都应起作用: 1) 在每个属性的setter中手动编写代码以跟踪更改 2) 编写一些代码,将“旧”副本与“更新”实例进行比较(与您在原始

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

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


有谁有更好的解决方案可以在这里使用吗

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

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

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


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

如果它确实是POCO,则不,您需要保留一份副本。如果您愿意将IsDirty标志添加到POCO中,则可以在更改属性时设置它。您可以将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。如果要防止这种情况,必须保存属性的原始值(或它们的散列),以便在属性设置器中进行比较。

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

  • 这是数据绑定的标准方式

  • 每次更新时,如果只想检测实际值与上次不同的属性,则有必要将每个属性的状态保存为“旧”值—例如,如果不希望自上次更新后从5更改为3到7再更改为5的属性

  • 如果您不关心这个区别,也不想使用propertychanged,那么可以为每个属性指定一个bool值,该值在setter中设置为true,并在每次更新时将其设置为false

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


你用什么来更新对象(ADO、EF、NHibernate)?你不能简单地在每次更改中记录POCO的全部细节吗?@Oded-是的,我可以,但我将记录大量数据,重复的数据将大大增加存储空间,这是可以避免的。