我有一个每N秒更新一次的POCO。我遇到的问题是,自上次更新以来,并非所有属性都可能已更改。
我需要知道自上次更新以来哪些属性已更改,因此我可以记录更改。我可以通过保留先前更新中的POCO副本并每次执行比较然后为每个属性更改触发事件来完成此操作。
有没有人有更好的解决方案我可以在这里使用?
答案 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)
创建各种属性的哈希并将其另存为属性本身,然后在验证时再次进行比较。