我想知道是否有人可能解决以下问题...我有一个基类,一系列派生类将继承。基类关心派生类的属性是否已更改。这是为数据传输对象设置“IsDirty”方法。
传统的方法是设置在基类中声明的IsDirty布尔标志。我希望以某种方式避免这种情况,并想知道是否可能有另一种方法?我担心开发人员不记得在派生类的属性上的等效集合操作中设置标志。我曾考虑过创建一个通用的“SetProperty”方法,该方法将获取属性名称和值,但认为可能有更优雅的东西。
作为旁注,关于使用反射的想法不是问题。不管反射费用如何,我想证明一种方法,并在未来的道路上进一步完善。
答案 0 :(得分:3)
您可以强制派生类实现INotifyPropertyChanged吗?在这种情况下,我会在基类构造函数中添加一个监听器到PropertyChanged事件并放松。派生类现在仍然需要遵循模式(这可能是你想要避免的东西?)。
很好地阅读了“没有使用文字字符串”方法来提升属性更改事件:http://monotorrent.blogspot.com/2009/12/yet-another-inotifypropertychanged-with_06.html
答案 1 :(得分:1)
用于控制对类(或一组类)的访问的适当模式是代理模式。此模式允许您在代理级别实现一次正确的isDirty行为,并将任何只读行为委派给未更改的实例。
与Factory模式一起使用时,此模式最有效,可以控制实例的创建。
此解决方案将屏蔽实例的运行时类型,因此如果您的设计依赖于运行时类型信息,您将需要单独解决此问题(例如,使用State模式)或找到替代方法。 / p>
答案 2 :(得分:0)
(Quick& Dirty) - 这样的事情怎么样? (你的GetHashCode实现可能会有所不同 - 我使用ReSharper自动生成这个)
public abstract class Animal
{
private int _originalHash;
public string Name { get; set; }
public int Age { get; set; }
public Animal(string name, int age)
{
this.Name = name;
this.Age = age;
this._originalHash = GetHashCode();
}
public override sealed int GetHashCode()
{
unchecked
{
return ((Name != null ? Name.GetHashCode() : 0) * 397) ^ Age;
}
}
public bool IsDirty
{
get
{
return this._originalHash != GetHashCode();
}
}
}
public class Cat : Animal
{
public Cat(string name, int age)
: base(name, age)
{
}
}
用它来测试......
var cat = new Cat("BobTheCat", 12);
Console.WriteLine(cat.IsDirty);
cat.Age = 13;
Console.WriteLine(cat.IsDirty);
结果是:
假 真