0

私は何百万ものメソッドのクラスを持つ API を扱っています。これらのメソッドが何をするかを知っています。それらは Web サービスの単なるプロキシです。

API は、適切なメソッド名を呼び出すリフレクションを使用して、これらのプロキシ メソッドを内部的に呼び出します (なぜこのように行われるのかは聞かないでください)。

API によって実装されていない Web サービスのメソッドがあり、これらのプロキシ メソッドを動的に「注入」する必要があります。

だから私の質問は:既存のクラス(拡張メソッドではない)にメソッドを追加するにはどうすればよいですか?

Reflection.Emitでこれを行うことができましたが、MSIL はわかりません。
APIと同じ基本クラスから継承する別のクラスを作成し、そこにメソッドを実装したので、メソッドをAPIクラスにコピーする方法があるかもしれません。同じものを参照する基本クラスのメソッドを呼び出します。

4

2 に答える 2

1

現実的には、既存のクラスを思い通りに変更する方法はありません。Reflection.Emit を使用しても、API が特定の型を呼び出しており、実行時に型の定義を変更できないため、意図したとおりに動作しません。Reflection.Emit でできることは、プロキシから継承する型を定義することですが、継承された型を API に読み込ませることは、依存性注入フレームワークを使用していない限り、おそらく不可能であることがわかります。

これを行う唯一の実際の方法は、逆コンパイルと再コンパイルを使用して dll のバイトコードを変更することです。これはPostsharpがAOPを行う方法ですが、他の理由でこれを行うことはありません.

このコードまたはそのライブラリにアクセスできる場合は、おそらく問題を回避するより良い方法があります。

于 2012-11-01T01:53:24.873 に答える
0

リフレクションも使用するように見えますが、頭痛の種を減らして、そのロジックを拡張メソッドにラップします(特に言わなかったとしても)。

この場合、なぜ拡張メソッドが悪い考えなのか、または API 開発者が公開していない何かをしたいのかについて、より多くの情報があれば、もっと役立つことを思いつくことができるかもしれません。

于 2012-11-01T01:50:14.773 に答える