2

重複の可能性:
リフレクションを使用して、オーバーライドされたベースメソッドを呼び出します

通常、次のようにオーバーライドされたメソッド内から基本クラスを呼び出すことができます。

public override void Foo(Bar b)
{
    base.Foo(b);
}

どうすればこれと同じ電話を振り返って行うことができますか?

編集:少し説明すると、AOPを使用して、ライブラリのエントリポイントを初期化されていない操作から保護しようとしています(私の場合、ライブラリを使用する前に「初期化」呼び出しはありません)。したがって、関連する呼び出しは技術的にはクラス内で終了しますが(AOPにより)、プリコンパイルされたコードは別のクラスで記述されます。つまり、すべてのエントリポイントに次のアドバイスを適用したいと思います。

if (!initialized)
    return base.<method>(<arguments>);

リフレクションを使用してオーバーライドされたベースメソッドを呼び出すに示されているILトリックは、私にとってはうまくいくと思います。私の場合は、より正当であると感じるので、もっとクリーンなものがあることを望んでいました。

4

1 に答える 1

2

編集:わかりました、それで少し説明します。どちらのクラスの外部からも基本クラスの実装を呼び出そうとしているのではありません。代わりに、オーバーライドされたクラス内から、親メソッドの実装を反射的に呼び出す必要があります。

... なぜ?オブジェクトは静的にそれが何であるかを知っているので、その基本クラスが何であるかを静的に知っています。基本クラスを2つ持つことはできません。また、基本クラスを既存の子クラスに動的に「割り当てる」こともできません。

あなたの質問に答えるために、あなたはできません。現在のインスタンスを使用して「Foo」をリフレクティブに呼び出そうとすると、無限に繰り返されます。これは、MethodInfoを呼び出すと、メソッド呼び出しが外部からのものであるかのように行われるため('原因)、ランタイムは継承/オーバーライド動作に従うためです。 。関連する質問のILハックを使用する必要があります。

于 2012-07-23T20:08:19.873 に答える