0

假设我有以下课程,

 Public Class Base

      Public Event PropertyChanged()

      Sub New()
           .....
      End Sub
 End Class

 Public Class Other
      Inherits Base

      Public Property X As String
 End Class

如果我想说,更改自动属性 ​​X 的代码定义(在运行时,可能在 中Sub New),这样我就可以抛出PropertyChanged事件,我该怎么做呢?

编辑:似乎 Postsharp 是一个可用的工具,可以完成我正在探索的功能,但我希望我的问题更具学术性而不是实用性。那么,我自己如何在编译时或运行时实现代码注入呢?

4

2 回答 2

2

我猜你正在寻找AOP。恕我直言,在 dotnet 平台上不成熟的一项非常好的技术。我相信,如果我错了,请纠正我,Postsharp是最著名的 AOP 框架。虽然生产不是免费的。安装和播放(可能还有 F/OSS)是免费的。另请查看此帖子以获取更多信息。

于 2012-05-15T20:42:18.193 回答
2

答案很简单:你不能。一旦加载了一个类型,就不能更改它的代码。

如果您想在INotifyPropertyChanged不为每个属性编写相同代码的情况下实现,有几种方法。

其中之一是创建属性MustOverrideabstract在 C# 中),然后在运行时创建另一个类,该类在运行时实现它(例如使用 Castle DynamicProxy)。

另一种是使用 AOP 在编译后(但在运行之前)使用 PostSharp 之类的东西重写代码。

另请查看实施 INotifyPropertyChanged - 是否存在更好的方法?, 以了解其他选项的概述。

于 2012-05-15T21:37:15.907 回答