注入/处理属性getter / setters?

时间:2011-10-30 23:01:45

标签: .net reflection .net-4.0 properties

我编写了一个抽象类,用于自动化大量的INotifyPropertyChanged和IDataErrorInfo。但是,这需要我指定一个自定义的getter / setter,它为每个属性调用一个自定义方法。

为了避免额外输入,我一直试图找到一种方法来覆盖/处理对象中的属性getter / setter,并调用自定义方法而不是生成的getter / setter。

我尝试从DynamicObject继承并重写TryGetMember和TrySetMember,但是如果将对象声明为动态,这些方法似乎只能起作用。

所以我想通过.NET反射或其他一些机制知道我想要实现的是什么,无论如何还要检测属性setter / getter是否已在代码中定义?

谢谢, 亚历克斯。

1 个答案:

答案 0 :(得分:3)

您可以使用Type.GetProperties方法获取有关类型属性的信息。您将收到PropertyInfo个对象的集合。这些对象具有CanReadCanWrite属性,表示属性是否可读/可写。

要覆盖此行为,您必须:

  1. 创建动态代理生成器
  2. 动态代理应拦截对get_PropA和set_PropA形式的方法的调用,这些方法实际上是getter和setter,您可以在其中添加额外的逻辑
  3. 不使用代码中的构造函数来创建这些对象,而是使用代理生成器创建对象,然后将其包装在代理中。
  4. 当然,您的课程不得密封,属性必须是虚拟的才能创建代理
  5. 对于免费解决方案,您最好使用Castle DynamicProxy。如果您准备花一些钱,请查看已经实现了许多类似性质的PostSharp。像INotifyProperty chage,undo / redo等。您还可以查看支持方面编织的任何AOP框架,但DynamicProxy将是我所描述的情况的选择。