【问题标题】:Inject/handle property getters/setters?注入/处理属性获取器/设置器?
【发布时间】:2011-12-18 09:52:11
【问题描述】:

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

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

我尝试从 DynamicObject 继承并覆盖 TryGetMember 和 TrySetMember,但是这些方法似乎仅在对象被声明为动态时才有效。

所以我想知道我想要实现的目标是否可以通过 .NET 反射或其他一些机制实现,还有是否可以检测是否已在代码中定义了属性 setter/getter?

谢谢, 亚历克斯。

【问题讨论】:

标签: .net reflection .net-4.0 properties


【解决方案1】:

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

要覆盖此行为,您必须:

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

对于免费解决方案,您最好使用Castle DynamicProxy。如果您准备好花钱,请查看PostSharp,它已经实现了许多类似性质的东西。像 INotifyProperty chage、撤消/重做等。您还可以查看任何支持方面编织的 AOP 框架,但对于您描述的情况,我会选择 DynamicProxy。

【讨论】:

    猜你喜欢
    • 2014-07-24
    • 1970-01-01
    • 2014-03-11
    • 2012-12-29
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多