有没有办法在运行时添加Field
(或者FieldInfo
,可能是相同的)类?
您无法在运行时更改类定义.但是,您可以创建一个继承自原始类的新类(如果不是sealed
)并声明该字段.您可以通过使用发出适当的IL代码来完成此操作System.Reflection.Emit
.
C#不允许它,因为它的所有类都基于元数据.的CLR(未C#)不允许字段的在运行时添加到元数据(1).这是C#能够在runitme添加字段的唯一方法.
这与IronPython等动态语言不同,后者基本上没有具体的元数据类.它们具有更多动态结构,可以在运行时更改.我相信IronPython只是将它的成员(字段和方法)保留在可以在运行时轻松更改的哈希表中.
在C#3.0中,您最好的资源是使用Reflection.Emit.但是这会产生一个全新的类而不是改变现有的类.
(1)某些API(例如分析API或ENC)允许这样做,但我不确定它们的功能是否扩展到添加字段.
不,C#不允许猴子修补.
您可以使用CodeDOM或Reflection.Emit 生成新类,但不能修改现有类.