11

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

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

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

提前致谢。

PS我对此没有预期用途,这只是一个好奇的问题。

4

2 回答 2

30

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

如果你使用dynamic,你几乎可以做任何你想做的事情。您可以ExpandoObject通过附加委托代替方法来模拟这一点,但是在自定义动态类型上,您几乎可以做任何事情 - 但这只会影响使用dynamicAPI 的调用者。举一个基本的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 等常用的最后一个技巧是动态子类化类型,并在子类中提供附加功能。例如,覆盖属性以拦截它们(延迟加载等)。

于 2012-06-22T18:33:19.283 回答
2

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

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

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

于 2012-06-22T18:32:52.843 回答