14

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

4

4 回答 4

9

您可能会发现这篇最近的文章很有启发性。基本上,它说你不能覆盖任何被标记internal的东西,并且来源是尽可能权威的。最好的希望是扩展方法。

于 2008-10-13T02:13:25.453 回答
6

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

因为你不在同一个程序集中,所以你不能做任何事情。如果它不是内部的,则可以在扩展类时在要覆盖的方法上使用 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();
        }
        ...
    }
}

可以使你想要完成的事情成为可能,但它不会很漂亮。

于 2008-10-13T02:26:06.470 回答
1

我相信您可以使用 Reflection 绕过类上的访问修饰符,因此也许您可以使用 Reflection.Emit 来生成从内部类型(但不是密封修饰符)继承的类型,尽管我找不到示例这个在线。

这当然适用于访问类的私有成员,并且可能适用于非密封类的继承。但是,如果目标方法还没有被标记为虚拟,它并没有多大帮助。

于 2008-10-13T02:55:06.913 回答
0

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

  • 反编译并将代码复制到您自己的项目中;根据需要修改
  • 重新编译/修补程序集并添加“InternalsVisibleToAttribute”
于 2008-10-13T06:06:34.187 回答