是否可以在运行时向EXISTING类添加方法? 为什么或者为什么不?

我想这可能会使用Reflection.Emit,

但是关于SO的类似问题只回答了如何动态创建类/方法,而不是如何更新现有类。

同样,是否可以在运行时删除方法/类? 如果是这样,我想可以删除该类,并使用旧方法和新方法将其添加回来。

提前致谢。

PS我没有这个用途,只是好奇心问题。

在常规的C#/ .NET中,答案是简单的“不”。 你可以做的最多就是编写一个DynamicMethod ,它可以表现得像那种类型的方法(访问私有字段等),但它永远不会出现在API上 – 你最终会得到一个委托。

如果你使用dynamic ,你可以做任何你想要的事情。 您可以通过附加委托代替方法来使用ExpandoObject来模拟,但是在自定义动态类型上,您可以执行大多数操作 – 但这只会影响使用dynamic API的调用方。 对于基本的ExpandoObject示例:

 dynamic obj = new ExpandoObject(); Func func = x => 2*x; obj.Foo = func; int i = obj.Foo(123); // now you see it obj.Foo = null; // now you don't 

对于属性和事件 (不是方法),您可以使用System.ComponentModel方法更改运行时显示的内容,但这只会影响通过System.ComponentModel访问的调用方,这主要意味着:UI数据绑定。 这就是DataTable如何将列表示为伪属性(暂时忘记“类型化数据集” – 它没有那些工作)。

为了完整起见,我还应该提到扩展方法 。 这些更像是编译器技巧,而不是运行时技巧 – 但有点允许您将方法添加到现有类型 – 对于小值“add”。

ORM等通常使用的最后一个技巧是动态子类化类型,并在子类中提供其他function。 例如,覆盖属性以拦截它们(延迟加载等)。

是否可以在运行时删除方法/类?

假设有可能。 对这些方法的调用将失败并产生未定义(但通常是灾难性的)行为。

所以我相信这是不可能的。