我想在System.Web.Script.Services.ScriptHandlerFactory和内部类中的其他.NET内容中自定义。不幸的是,这是一个内部课程。尝试自定义此类中的方法时,我有哪些选项?
答案 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)
这取决于装配。这可能会违反一些许可(虽然它类似于某种静态链接),甚至可能使部署成为一场噩梦,但你可以考虑: