14

System.Web.Script.Services.ScriptHandlerFactoryおよび内部クラス内の他の.NETのものでカスタマイズしたいものがあります。残念ながら、これは内部クラスです。このクラスのメソッドをカスタマイズしようとすると、どのようなオプションがありますか?

4

4 に答える 4

9

この最近の記事は啓発的であると思うかもしれません。基本的に、それはあなたがマークされたものを上書きすることはできないと言っていますinternal、そしてソースはそれが得るのとほぼ同じくらい権威があります。期待できる最善の方法は拡張メソッドです。

于 2008-10-13T02:13:25.453 に答える
6

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();
        }
        ...
    }
}

これあなたが達成したいことを可能にするかもしれませんが、それはきれいではありません。

于 2008-10-13T02:26:06.470 に答える
1

Reflectionを使用してクラスのアクセス修飾子を回避できると思います。したがって、Reflection.Emitを使用して、内部型から継承する型(ただし、封印された修飾子ではない)を生成できますが、例は見つかりません。このオンラインの。

これは確かにクラスのプライベートメンバーにアクセスするために、そしておそらく非封印されたクラスの継承のために機能します。ただし、ターゲットメソッドがまだ仮想としてマークされていない場合は、あまり役に立ちません。

于 2008-10-13T02:55:06.913 に答える
0

それはアセンブリに依存します。これはおそらくいくつかのライセンスに違反する可能性があり (ある種の静的リンクに似ていますが)、展開を悪夢にすることさえありますが、次のことを考慮することができます:

  • コードを逆コンパイルして、独自のプロジェクトにコピーします。必要に応じて修正
  • アセンブリを再コンパイル/パッチし、「InternalsVisibleToAttribute」を追加します
于 2008-10-13T06:06:34.187 に答える