在VB.NET中运行时修改属性代码
假设我有以下几节课在VB.NET中运行时修改属性代码,vb.net,reflection,Vb.net,Reflection,假设我有以下几节课 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中)
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是一个可以实现我正在探索的功能的工具,但我希望我的问题更具学术性而非实用性。那么,我自己如何在编译时或运行时实现代码注入呢 我想你在找我。这是一项非常好的技术,IMHO在dotnet平台上还不成熟。我相信,如果我错了,请纠正我,这是最著名的AOP框架。虽然这不是免费的生产;安装和播放(可能还有F/OSS)是免费的。还要查看更多信息。我想您正在寻找。这是一项非常好的技术,IMHO在dotnet平台上还不成熟。我相信,如果我错了,请纠正我,这是最著名的AOP框架。虽然这不是免费的生产;安装和播放(可能还有F/OSS)是免费的。还要查看更多信息。答案很简单:你不能。一旦加载类型,就不能更改其代码 如果要实现
INotifyPropertyChanged
,而不为每个属性编写相同的代码,有几种方法
其中之一是在C#中创建属性MustOverride
(abstract
),然后在运行时创建另一个类,在运行时实现它(例如使用Castle DynamicProxy)
另一种是使用AOP在编译后(但在运行之前)使用PostSharp之类的东西重写代码
另外,请看一下,了解其他选项的概述。答案很简单:你不能。一旦加载类型,就不能更改其代码 如果要实现
INotifyPropertyChanged
,而不为每个属性编写相同的代码,有几种方法
其中之一是在C#中创建属性MustOverride
(abstract
),然后在运行时创建另一个类,在运行时实现它(例如使用Castle DynamicProxy)
另一种是使用AOP在编译后(但在运行之前)使用PostSharp之类的东西重写代码
另外,请看一看,以了解其他选项的概述。如果需要从中调用PropertyChanged事件,我认为您不能使用自动属性。@LarsTech,因为编译器为属性生成代码,所以我必须在运行时以某种方式更改代码才能这样做。我假设编译器创建的内容与我键入的显式属性定义相同。我试图得到的一个例子可能是在继承
Base
的所有类中向所有属性添加事件,而不更改继承类的实际源代码。我不太清楚。我认为您必须使用Get和Set方法编写完整的属性,而不是自动属性,在Set方法中,您将RaiseEvent PropertyChanged()
。我不是说修改源代码,我不想按原样编译属性,而是使用反射和内置的.Net代码生成,在运行时通过基类将代码添加到属性中。这类似于如果需要从中调用PropertyChanged事件,我认为不能使用自动属性。@LarsTech,因为编译器为属性生成代码,所以我必须在运行时以某种方式更改代码才能执行此操作。我假设编译器创建的内容与我键入的显式属性定义相同。我试图得到的一个例子可能是在继承Base
的所有类中向所有属性添加事件,而不更改继承类的实际源代码。我不太清楚。我认为您必须使用Get和Set方法编写完整的属性,而不是自动属性,在Set方法中,您将RaiseEvent PropertyChanged()
。我不是说修改源代码,我不想按原样编译属性,而是使用反射和内置的.Net代码生成,在运行时通过基类将代码添加到属性中。这与优点类似,我以前没有读过关于AOP的任何内容。感谢Postsharp的建议,但我想我的问题更多的是学术性而不是实用性。很好,我以前没有读过任何关于AOP的文章。谢谢你的建议,但我想我的问题更多的是学术性而不是实用性。