2011-10-30 50 views
2

我已经写了一个抽象类,用于自动处理大量INotifyPropertyChanged和IDataErrorInfo。然而,这要求我指定一个自定义getter/setter,它为每个属性调用一个自定义方法。注入/处理属性获取者/设置者?

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

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

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

谢谢, Alex。

+1

试试这个。 http://code.google.com/p/notifypropertyweaver/ – Simon

回答

3

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

要覆盖此行为,你就必须:

  1. 创建动态代理生成
  2. 动态代理要拦截在get_PropA和set_PropA的形式方法,这是有效的getter和setter,在那里你可以调用添加您的附加逻辑
  3. 而不是使用代码中的构造函数来创建这些对象,使用您的代理生成器将创建该对象,然后将其包装在代理中。
  4. 当然,你的类不能被密封,性能必须以创建代理

对于免费的解决方案你最好使用Castle DynamicProxy是虚拟的。如果你准备花一些钱,看看PostSharp已经实现了许多相似性质的东西。像INotifyProperty chage,撤销/重做等等。你也可以看看支持方向编织的任何AOP框架,但DynamicProxy将是我所选择的你所描述的情况。