我想这可能会使用 Reflection.Emit,
但是关于 SO 的类似问题仅回答如何动态创建类/方法,而不是如何更新现有类。
同样,是否可以在运行时删除方法/类?如果是这样,我想可以删除该类,然后使用其旧方法和新方法将其添加回来。
提前致谢。
PS我对此没有预期用途,这只是一个好奇的问题。
我想这可能会使用 Reflection.Emit,
但是关于 SO 的类似问题仅回答如何动态创建类/方法,而不是如何更新现有类。
同样,是否可以在运行时删除方法/类?如果是这样,我想可以删除该类,然后使用其旧方法和新方法将其添加回来。
提前致谢。
PS我对此没有预期用途,这只是一个好奇的问题。
在常规 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 等常用的最后一个技巧是动态子类化类型,并在子类中提供附加功能。例如,覆盖属性以拦截它们(延迟加载等)。
是否可以在运行时删除方法/类?
假设这是可能的。对这些方法的调用将失败并产生未定义的(但通常是灾难性的)行为。
所以我确定这是不可能的。