2016-05-11 93 views
1

我有一个泛型类,它带有一个参数,它表示用于序列化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. 
    } 
    } 

回答

0

没有一个定制的setter没有,没有什么可以做的。

你想要做什么的通常模式是实现INotifyPropertyChanged接口,该接口是为需要跟踪和通知其属性更改的类(或结构)而精确创建的。

如果你和我一样懒,我会创建一个分析器,在我的应用程序开始时扫描所有使用属性标记的类,并将所有属性创建为虚拟,然后使用codedom创建一个新的类可以继承自找到的类并实现INotifyPropertyChanged,那么当泛型调用的类型为已知注册类型时,您可以拥有一个通用Factory,该类可以返回这些新类的实例。

我以前用过这个类,我想要远程属性,只是标记了类,我的扫描系统重写了getter/setter以透明地执行远程调用,最后的概念是相同的。

开始时有很多工作,但如果你有大量的类,那么编写代码要比在所有类上实现INotifyPropertyChanged少得多。

+0

是的,我引用的dll有数百个类,它们的任何属性都不是虚构的。我希望能够反思性地完成所有这些。 – user3562367

+0

那么你最好的选择是创建一个类似我所描述的系统,用codedom动态地重新创建类的类型。 – Gusman

+0

Whops,没有阅读有关虚拟位...如果这是你的情况,那么也许使用'new'关键字你可以做到这一点,只要记住读取和写入基本属性。 – Gusman