我想这可能会使用Reflection.Emit,
但a similar question on SO仅回答如何动态创建类/方法,而不是如何更新现有类。
与此类似,是否可以在运行时删除方法/类?如果是这样,我想可以删除该类,并使用旧方法和新方法将其添加回来。
提前致谢。
P.S。我没有预期用途,这只是好奇心。
答案 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)
是否可以在运行时删除方法/类?
假设有可能。对这些方法的调用将失败并产生未定义(但通常是灾难性的)行为。
所以我确信这是不可能的。