我会考虑使用含有两个事物的抽象超:
- ,声明“轨道 变化”是开启还是不是一个标志(默认为 假)
- 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