2012-04-23 69 views
2

我有一個每N秒更新一次的POCO。我遇到的問題是,自上次更新後,並非所有屬性都可能發生更改。檢查POCO上的屬性值是否發生更改

我需要知道自上次更新後哪些屬性發生了更改,因此我可以記錄更改。我可以通過保留上一次更新的POCO副本並每次進行比較,然後可能爲每個屬性更改發起一個事件來做到這一點。

有沒有人有更好的解決方案,我可以在這裏使用?

+0

你用什麼來更新對象(ADO,EF,NHibernate)? – 2012-04-23 13:13:34

+1

您是否可以不在每次更改時簡單記錄POCO的全部詳細信息? – Oded 2012-04-23 13:14:00

+0

@Oded - 是的,但我可以記錄大量的數據,重複數據將大大增加存儲空間,這是可以避免的。 – Mattl 2012-04-23 13:32:59

回答

2
  • http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx這是數據綁定的標準方式。

  • 每次您進行更新時,將每個屬性的狀態保存爲「舊」值是必要的,因爲在這種情況下,您只需要檢測與上次時間具有不同值的屬性 - 例如,如果不不希望自上次更新以來,將屬性從5更改爲3至7更改爲5。

  • 如果你不關心這個區別,並且不想使用propertychanged,你可以給每個屬性設置一個布爾值,他們在setter中設置爲true,並且每次更新時都將它們設置爲false 。

  • 你可以創建一個GetProperty/SetProperty機制 - 你可以在setters/getters中調用這些函數,然後你可以用任何你想要的方式保存實際的數據和任何關於它的元數據。然而,這不再是真正的POCO。

0

據我所知,沒有什麼「內置」.NET以跟蹤任何類的屬性更改。但是,以下任何一項都應該有效:

1)在每個屬性的setter中手動編寫代碼以跟蹤更改。

2)編寫一些比較「舊」副本和「更新」實例的代碼(與原始帖子中說的相同)。

3)使用AOP框架(如PostSharp)爲每個屬性添加某種更新通知。

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仍然會設置。如果你想防止這種情況,你必須保存屬性設置器中要比較的屬性的原始值(或它們的散列)。

0

創建各種屬性的散列並將其保存爲屬性本身,然後在驗證時再次進行比較。