我的應用程序中有多個業務對象(C#,Winforms,WinXP)。當用戶在UI上執行某些操作時,這些對象中的每一個都會被應用程序的不同部分修改和更新。每次修改後,我需要首先檢查已更改的內容,然後記錄對對象所做的更改。記錄這個目的是爲了創建一個對應用程序中正在進行的活動的全面跟蹤。捕獲對象屬性的更改
這些對象中包含許多包含其他對象的名單,這嵌套可以幾個層次深。對於任何解決方案的兩個主要要求是
- 捕捉儘可能準確地
- 保持性能成本最低的變化。
如業務對象:
public class MainClass1
{
public MainClass1()
{
detailCollection1 = new ClassDetailCollection1();
detailCollection2 = new ClassDetailCollection2();
}
private Int64 id;
public Int64 ID
{
get { return id; }
set { id = value; }
}
private DateTime timeStamp;
public DateTime TimeStamp
{
get { return timeStamp; }
set { timeStamp = value; }
}
private string category = string.Empty;
public string Category
{
get { return category; }
set { category = value; }
}
private string action = string.Empty;
public string Action
{
get { return action; }
set { action = value; }
}
private ClassDetailCollection1 detailCollection1;
public ClassDetailCollection1 DetailCollection1
{
get { return detailCollection1; }
}
private ClassDetailCollection2 detailCollection2;
public ClassDetailCollection2 DetailCollection2
{
get { return detailCollection2; }
}
//more collections here
}
public class ClassDetailCollection1
{
private List<DetailType1> detailType1Collection;
public List<DetailType1> DetailType1Collection
{
get { return detailType1Collection; }
}
private List<DetailType2> detailType2Collection;
public List<DetailType2> DetailType2Collection
{
get { return detailType2Collection; }
}
}
public class ClassDetailCollection2
{
private List<DetailType3> detailType3Collection;
public List<DetailType3> DetailType3Collection
{
get { return detailType3Collection; }
}
private List<DetailType4> detailType4Collection;
public List<DetailType4> DetailType4Collection
{
get { return detailType4Collection; }
}
}
//more other Types like MainClass1 above...
我可以假設,我將有機會獲得舊值和對象的新值。
在這種情況下,我能想到的2種方式,試圖做到這一點沒有被告知哪些已明確改變。
- 使用反射和迭代通的對象的所有屬性和比較 那些與老對象的相應屬性 。日誌 已更改的任何屬性。這 方法似乎更加靈活, ,我不會擔心,如果任何 新屬性添加到任何 對象。但它也似乎表現沉重。
- 在setter中記錄所有對象的所有屬性的更改。 除了這個將 需要我改變很多代碼的事實外,它似乎更加蠻力。這將是 維護繁重和不靈活,如果 某人更新任何對象 類型。但這種方式也可能是 性能與光,因爲我不會 需要檢查哪些改變和日誌 性質被改變什麼。
建議以上述方法更好的方法和/或改進,歡迎
我寫了一個reflction爲基礎,但預編譯單個對象(對)比較器這樣回答。所以它可以做得相對便宜。打開弓,不能看 - 但會嘗試稍後找到它。 – 2010-09-29 15:20:14