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