在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的文章。谢谢你的建议,但我想我的问题更多的是学术性而不是实用性。