繁体   English   中英

是否可以在运行时将方法添加到现有类? 为什么或者为什么不?

[英]Is it possible to add a method to an EXISTING class at runtime? why or why not?

我想这可能会使用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”值。

一个最终招,通过奥姆斯等常用-是动态子类的类型,以及在子类中提供附加的功能。 例如,覆盖属性以拦截它们(延迟加载等)。

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

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

因此,我确定这是不可能的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM