假设我有以下课程,
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是一个可用的工具,可以实现我正在探索的功能,但我希望我的问题更具学术性而不是实用性。那么,我怎样才能在编译时或运行时自己实现代码注入?
答案 0 :(得分:2)
我猜您正在寻找AOP。一个非常好的技术,恕我直言在dotnet平台上并不成熟。我相信,如果我错了,请纠正我,Postsharp是最着名的AOP框架。对于生产而言,这不是免费的;安装和播放(可能还有F / OSS)是免费的。另请查看this post以获取更多信息。
答案 1 :(得分:2)
答案很简单:你做不到。加载类型后,您无法更改其代码。
如果你想在不为每个属性编写相同代码的情况下实现INotifyPropertyChanged
,有几种方法。
其中一个是在C#中创建属性MustOverride
(abstract
),然后在运行时创建另一个类,在运行时实现它(例如使用Castle DynamicProxy)。
另一个是使用AOP在编译后(但在运行之前)使用像PostSharp这样的代码重写代码。
另请查看Implementing INotifyPropertyChanged - does a better way exist?,了解其他选项。