你如何“覆盖”C#中的内部类?

时间:2008-10-13 02:08:56

标签: c# override internal-class

我想在System.Web.Script.Services.ScriptHandlerFactory和内部类中的其他.NET内容中自定义。不幸的是,这是一个内部课程。尝试自定义此类中的方法时,我有哪些选项?

4 个答案:

答案 0 :(得分:9)

您可能会发现this recent article具有启发性。基本上,它表示你不能覆盖标记为internal的任何内容,并且源代码具有权威性。你最希望的是一种扩展方法。

答案 1 :(得分:6)

内部关键字表示代码单元(类,方法等)对其所在的程序集是“公共的”,但对任何其他程序集都是私有的。

因为你不在同一个集会中,所以你什么也做不了。如果它不是内部的,那么在扩展类时,你可以在你覆盖的方法上使用new关键字(隐藏原始实现)。

简而言之:你是SOL。

我唯一可以想到的就是编写一个代理类,其中一个私有字段是你想要扩展的类,你实现它的所有方法并代理它们的调用。这样你仍然可以自定义输出,但你必须使用你的课程,并考虑到它标记为内部,我不确定没有一些严重的黑客攻击是可能的。

using System;
...
using System.Web.Script.Services

namespace MyGreatCompany.ScriptServices 
{
    public class MyScriptHandlerFactory /* implement all the interfaces */
    {
        private ScriptHandlerFactory internalFactory;
        public MyScriptHandlerFactory()
        {
            internalFactory = new ScriptHandlerFactory();
        }
        ...
    }
}

这个可以制作你想要完成的东西,但它不会很漂亮。

答案 2 :(得分:1)

我相信你可以使用Reflection来绕过类的访问修饰符,所以也许你可以使用Reflection.Emit来生成一个继承自内部类型的类型(但 NOT 密封修饰符),虽然我在网上找不到这个例子。

这当然适用于访问类的私有成员,并且可能用于继承非密封类。但如果目标方法尚未标记为虚拟,则无济于事。

答案 3 :(得分:0)

这取决于装配。这可能会违反一些许可(虽然它类似于某种静态链接),甚至可能使部署成为一场噩梦,但你可以考虑:

  • 将代码反编译并复制到您自己的项目中;根据需要修改
  • 重新编译/修补程序集并添加“InternalsVisibleToAttribute”