如何在运行时更改类的定义?

4

我能否在运行时更改类的属性(添加/删除属性)?


4
真正的问题是你为什么想要这样做?你可能正在试图解决错误的问题。 - djdd87
@GenericTypeTea 学术问题 :) (不是作业,只是我和一些朋友讨论这个可能性) - mcabral
啊,仙女'noof然后!学术'erise离开。 - djdd87
“工具(IDE)供应商希望能够进行修复和继续调试。也就是说,在调试过程中,识别问题,修复它,并使用修复后的代码继续调试。部署长时间运行服务器的组织希望能够在不关闭服务器的情况下修复错误。” - jamie
5个回答

10

除非您正在使用ExpandoObject的实例,否则无法执行此操作。 CLR类型的元数据在程序集中是固定的,无法在执行时更改。如果您确实需要这种动态行为,必须使用支持此行为的动态类型(如EpandoObject)。


6
我之前从未听说过ExpandoObject,我很高兴我的同事们也不知道它。 - MusiGenesis

4
只是为了补充Andrew Hare的回答:使用C# 4和.NET 4,您可以从DynamicObject继承并重新定义对类型实例执行各种操作的含义。DynamicObject定义了许多虚拟方法,您可以重写这些方法以控制例如访问属性的含义。您可以使用此功能允许向实例添加/删除属性,这与ExpandoObject几乎相同。
有关ExpandoObject的更多信息,请参见此问题此博客文章

2

您可以使用System.Reflection.Emit在运行时创建自己的类型-链接


1
对于 UI 开发(即呈现给最终用户的内容),请考虑实现 ICustomTypeDescriptor(位于 System.ComponentModel 中)。许多控件都知道此接口,并将使用它来查询实例或类型公开的属性。

1

如果您使用的是3.5版本,您可以使用IL创建动态类型并完成任务,但这会更加困难,不过我想也有一些框架可以实现。


动态代码注入,实际上我正在为此编写一个框架。您可以定义一些C#属性,然后在需要的地方注入代码。这对于关注点分离非常有用。 - BartoszAdamczewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接