我有一个泛型类,它带有一个参数,它表示用于序列化T类对象的第三方DLL的元素。我想要做的是给我的类添加一个'Dirty'贴图,并且只要我的元素的嵌套属性发生变化就会延迟触发它。关于嵌套属性更改跟踪的c#
是否有可能何时访问属性捕获请求并确定哪些属性正在改变?如果正在执行SET,我可以记录该子属性P现在是脏的,需要保存?或者至少有一点表明SOMETHING已经改变了?
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.
}
}
是的,我引用的dll有数百个类,它们的任何属性都不是虚构的。我希望能够反思性地完成所有这些。 – user3562367
那么你最好的选择是创建一个类似我所描述的系统,用codedom动态地重新创建类的类型。 – Gusman
Whops,没有阅读有关虚拟位...如果这是你的情况,那么也许使用'new'关键字你可以做到这一点,只要记住读取和写入基本属性。 – Gusman