【问题标题】:What are some elegant ways to monitor a property via an attribute?通过属性监控属性有哪些优雅的方法?
【发布时间】:2014-03-05 15:10:58
【问题描述】:

我有一些类的属性,我想缓存它们的值(它们的过去值)。对象本身会跟踪它们的变化,但我希望能够用一个简单的属性标记我想要跟踪的属性。如何在每个属性没有任何手动代码的情况下监控属性的更改?

【问题讨论】:

  • Unity interception 是一个选项 - 包装所有实例并在调用之前/之后捕获信息。与属性无关,所以不是答案...(我不完全确定您的意思是“通过属性监控”,因为属性本​​身并不意味着/做任何事情)...
  • @AlexeiLevenkov 我想创建一个系统,当一个属性被标记为一个属性时,它的变化会被其他子系统自动监控。
  • 您可能希望在答案中添加您希望代码的外观 - 示例对象和对象的示例创建...另外请注意,如果您已经有类似 INotifyPropertyChanged 的连接。
  • 你有没有试过INotifyPropertyChanged接口。 stackoverflow.com/questions/2306746/…
  • @user3277522 这很邪恶,因为我必须使用反射来取回值……但我想这无济于事。 :)

标签: c# .net reflection properties attributes


【解决方案1】:

使用通用代理模式。 有很多代理生成器,但您可以使用远程提供的真实/透明代理。

拦截对属性的调用并做你想做的事。

【讨论】:

    【解决方案2】:

    如果您希望属性扩展或更改属性的行为,例如监控、缓存、验证或日志记录,您可能需要考虑AOP (Aspect Oriented Programming)a good white paper can be found here too

    .net 中最常用的 AOP 工具是Post Sharp

    使用集成在您的解决方案和 Visual Studio 中的库/工具,它会查找它识别为方面的特定属性,并在编译(或运行时,取决于某些因素)时将它们应用到目标属性、方法、类,甚至是整个程序集。

    使用 post sharp,location interception aspect 将允许您拦截目标的执行(在执行之前、之后或发生错误时)并编写一些代码以在这些拦截发生时执行,您将获得元数据关于被拦截的目标(例如PropertyInfo)和当前被拦截的对象的实例,或发生的错误。

    有一些预定义的方面(属性)与 post sharp 一起打包,您可以立即使用它们,或者您可以创建具有任何不同行为的自己的方面(属性)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 2010-10-13
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      相关资源
      最近更新 更多