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

时间:2012-06-22 18:28:58

标签: c# dynamic reflection.emit

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

a similar question on SO仅回答如何动态创建类/方法,而不是如何更新现有类。

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

提前致谢。

P.S。我没有预期用途,这只是好奇心。

2 个答案:

答案 0 :(得分:28)

在常规的C#/ .NET中,答案是简单的“不”。你能做的最多就是写一个DynamicMethod 行为就像那种类型的方法(访问私有字段等),但它不会出现在API上 - 你只是以代表结束。

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

dynamic obj = new ExpandoObject();
Func<int, int> 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等通常使用的最后一个技巧是动态子类化类型,并在子类中提供其他功能。例如,覆盖属性以拦截它们(延迟加载等)。

答案 1 :(得分:2)

  

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

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

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