我會考慮使用含有兩個事物的抽象超:
- ,聲明「軌道 變化」是開啓還是不是一個標誌(默認爲 假)
- a包含鍵值歷史記錄的詞典實例
...然後在您感興趣的每個屬性訪問器中調用Base.TrackChange(string,object)更改。傳遞的字符串是屬性的名稱(使用反射/從堆棧跟蹤中拉出屬性名稱: - 表示每個方法中的代碼可以完全相同)...傳遞的對象只是元變量的值」。一些仔細的反射/堆棧跟蹤檢查可能意味着您可以刪除此方法中的字符串參數...意味着您將實體Class C#編碼要求降到最低。
該標誌存在,因爲對象的基本狀態初始化意味着屬性可能會發生變化(設置訪問器調用),直到對象第一次完全水合。
該字典是用來拖網變化(審計?)等等。如果你所需要的只是在'IsDirty'問題上簡單的真/假,則將其擴展到第二個布爾值。
喜歡的東西:
public abstract Class EntityBase
{
private bool _changesAreTracking = false;
private Dictionary<string, object> _changes = null;
public EntityBase() {}
public TrackChange(string propertyName, object value)
{
if(_changesAreTracking)
{
if(_changes == null) { _changes = new Dictionary<string, object>(); }
_changes.Add(propertyName, value);
}
}
public void StartTrackChanges()
{
_changesAreTracking = true;
}
public bool HasChanged()
{
bool returnThis = false;
if(_changes != null && _changes.Keys.Count() > 0)
{
returnThis = true;
}
return returnThis;
}
public bool HasChanged(string propertyName)
{
bool returnThis = false;
if(_changes != null && _changes.Keys.Contains(propertyName))
{
returnThis = true;
}
return returnThis;
}
}
這肯定會做到這一點。從我+1。 – 2010-03-26 17:06:48