在运行时是否有可能向现有的类中添加一个方法?为什么或为什么不?

10 浏览
0 Comments

在运行时是否有可能向现有的类中添加一个方法?为什么或为什么不?

我认为这可能会使用 Reflection.Emit,但是在SO上的类似问题只回答了如何动态创建类/方法,而没有回答如何更新现有类的方法。

在同样的思路下,是否有可能在运行时删除方法/类?如果是这样,我想可以直接删除类,然后再添加回原来的方法以及新的方法。

提前感谢您的帮助。

P.S. 我没有打算使用这个,这只是出于好奇。

0
0 Comments

从上面的内容可以看出,问题的出现原因是因为在运行时添加一个方法到现有的类可能导致方法调用失败,产生未定义的行为。然后,回答问题的人表示他相信这是不可能的。接着,他们讨论了在编译代码时针对一个程序集版本构建代码,但在运行时使用另一个版本时可能会出现的MissingMethodExceptionTypeLoadException异常。接下来回答问题的人指出,尽管可能会导致运行时错误,但这并不是不能做的理由。然后他们讨论了在.NET中防止这种情况的好处。最后,他们提到了使用动态特性可以进入DLR领域,因此MissingMethodException将在运行时而不是编译时抛出。

根据上述内容,可以得出结论:在现有的类中添加一个方法在运行时是不可能的,因为它可能会导致未定义的行为和运行时错误。在.NET中,这是被禁止的。然而,使用动态特性可以在运行时抛出异常,而不是在编译时。

0
0 Comments

在常规的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); // 现在你可以看到它
obj.Foo = null; // 现在你看不到了

对于属性和事件(而非方法),可以使用System.ComponentModel方法在运行时更改显示内容,但这只影响通过System.ComponentModel获取访问权限的调用者,主要包括:UI数据绑定。这就是DataTable如何将列表示为伪属性的方式(暂时忽略“类型化数据集” - 它可以在没有这些的情况下工作)。

为了完整起见,我还应该提到扩展方法。这些更多是编译器的技巧,而不是运行时的技巧 - 但是它们允许您对现有类型进行一些方法的扩展 - 但是只能对于一些较小的值进行扩展。

最后一个常用的技巧,常用于ORM等 - 是动态子类化该类型,并在子类中提供额外的功能。例如,重写属性以拦截它们(延迟加载等)。

哈哈,“对于小的添加值”。我猜这意味着对于静态方法来说是这样的:-P。

不,实际上我是指“它们实际上不是类型上的方法”。

非常好的回答。关于为什么不能添加方法,有什么想法吗?它会违反某种开发原则/难以实现吗?

0