System.Web.Script.Services.ScriptHandlerFactoryおよび内部クラス内の他の.NETのものでカスタマイズしたいものがあります。残念ながら、これは内部クラスです。このクラスのメソッドをカスタマイズしようとすると、どのようなオプションがありますか?
4 に答える
この最近の記事は啓発的であると思うかもしれません。基本的に、それはあなたがマークされたものを上書きすることはできないと言っていますinternal
、そしてソースはそれが得るのとほぼ同じくらい権威があります。期待できる最善の方法は拡張メソッドです。
internalキーワードは、コードの単位(クラス、メソッドなど)が、それが含まれるアセンブリに対して「パブリック」であるが、他のアセンブリに対してはプライベートであることを示します。
同じアセンブリにいないため、何もできません。内部にない場合は、クラスを拡張するときに、オーバーライドするメソッドでnewキーワードを使用できます(元の実装を非表示にするため)。
要するに:あなたはSOLになるべきです。
私が考えることができる唯一のことは、プロキシクラスを作成することです。ここで、プライベートフィールドの1つは拡張したいクラスであり、そのすべてのメソッドを実装し、それらの呼び出しをプロキシします。そうすれば、出力をカスタマイズすることはできますが、クラスを使用する必要があり、内部としてマークされていることを考えると、深刻なハッキングなしでそれが可能かどうかはわかりません。
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();
}
...
}
}
これはあなたが達成したいことを可能にするかもしれませんが、それはきれいではありません。
Reflectionを使用してクラスのアクセス修飾子を回避できると思います。したがって、Reflection.Emitを使用して、内部型から継承する型(ただし、封印された修飾子ではない)を生成できますが、例は見つかりません。このオンラインの。
これは確かにクラスのプライベートメンバーにアクセスするために、そしておそらく非封印されたクラスの継承のために機能します。ただし、ターゲットメソッドがまだ仮想としてマークされていない場合は、あまり役に立ちません。
それはアセンブリに依存します。これはおそらくいくつかのライセンスに違反する可能性があり (ある種の静的リンクに似ていますが)、展開を悪夢にすることさえありますが、次のことを考慮することができます:
- コードを逆コンパイルして、独自のプロジェクトにコピーします。必要に応じて修正
- アセンブリを再コンパイル/パッチし、「InternalsVisibleToAttribute」を追加します