我有一个带有单个参数的泛型类,它代表第三方DLL的元素,用于T类对象的序列化。我想做的是向我的类添加一个"Dirty"映射,并在我的Element的一个嵌套属性发生更改时惰性地触发它。
是否可以在访问属性时捕获请求并识别正在更改的属性?如果正在执行SET,我可以记录子属性P现在是脏的,需要保存吗?或者至少有一个比特表明事情发生了变化?
public class ResourceSerializer<T>
where T : Base, new()
{
T element;
Dictionary<String,Boolean> dirtyMap;
public T Element { get { return this.getElement(); } }
public Boolean IsDirty { get; private set; }
public ResourceSerializer()
{
dirtyMap = new Dictionary<string,bool>();
element = new T();
// code to reflect back upon T's Properties and build out the dirtyMap.
// I already can do this I just omitted it.
// in my Person example there would be keys: 'FirstName', 'LastName', 'Age', 'Gender', 'PrimaryAddress'
}
// how can I call this programmatically?
void flagDirty(String property)
{
dirtyMap[property] = true;
this.IsDirty = true;
}
T getElement()
{
// In case I need to do a thing before returning the element.
// Not relevant to the question at hand.
return this.element;
}
}
"Base"的高级示例。你可以看到我需要如何重复我的动作,因为并不是所有的东西都是原始的。我有一个管理器级别的类,它记录所有这些ResourceSerializer对象。
public class Base
{
public Base()
{
}
}
public enum gender
{
Male,
Female,
Other,
Unspecified,
}
public class Address : Base
{
public String Street { get; set; }
public String State { get; set; }
public String Zip { get; set; }
public Address() : base()
{
}
}
public class Person : Base
{
public String FirstName { get; set; }
public String LastName { get; set; }
public Int16 Age { get; set; }
public gender Gender { get; set; }
public Address PrimaryAddress { get; set; }
public Person() : base()
{
}
}
public class Patient : Person
{
public Person PrimaryContact { get; set; }
public Patient() : base()
{
}
}
然后我会把一个小类变成一个测试方法。。
public class DoThing
{
public DoThing()
{
ResourceSerializer<Person> person = new ResourceSerializer<Person>();
person.Element.Age = 13; // catch this and mark 'Age' as dirty.
}
}
如果没有自定义的setter no,就无法做到这一点。
您尝试执行的通常模式是实现INotifyPropertyChanged接口,该接口正是为需要跟踪和通知其属性更改的类(或结构)创建的。
如果你和我一样懒惰,我会创建一个分析器,在我的应用程序开始时,它会扫描我所有用属性标记的类,并将所有创建为虚拟的属性,然后使用codedom创建一个新的类,它将从找到的类继承,并实现INotifyPropertyChanged,然后可以有一个泛型工厂,当泛型调用的类型是已知的注册类型时,它会返回这些新类的实例。
我以前曾将其用于想要具有远程属性的类,只是标记了该类,我的扫描系统重写了getter/setter以透明地进行远程调用,最后的概念是一样的。
一开始需要做很多工作,但如果您有大量的类,那么要编写的代码将比在所有类上实现INotifyPropertyChanged少得多。