12

(理論的には)実行時に新しい型を作成することは可能ですが、実行時に既存の型のメソッド本体を変更することは可能ですか?私の計画(これを機能させることができる場合)は、カスタム属性を使用してメソッドにタグを付け、実行時にその属性を使用してメソッドを検索し、独自のコードの一部をメソッド本体に挿入することです。

助言がありますか?

そのアプローチを機能させることができない場合は、基本クラスの仮想メソッド(属性を含む)を静的ファクトリと組み合わせて、実行時に生成されたメソッドで派生動的型を吐き出すことができると思います。子クラスで。ただし、これは使用するのにそれほどクリーンではありません。

4

5 に答える 5

9

アフターコンパイラであるPostSharpは、属性を使用してコード内の注入ポイントをマークすることで、あなたが説明したものと同様のことを行います.唯一の違いは、コンパイル時にそれを行うことです.

ただし、メソッド本体を変更するのではなく、ContextBoundObjectから派生したクラスを使用して実行時に行うこともできます。これは、それに対して行われたすべての呼び出しをインターセプトできる .Net クラスです。ContextBoundObject を使用して AOP を実行する方法を説明しているMSDN Magazine の記事を次に示します。(記事の.Net部分の側面を確認してください)

3 番目のオプションとして、動的コード生成 (Reflection.Emit または CodeDom) を属性および仮想メソッドと組み合わせて使用​​して、コードを挿入できる派生クラスを動的に生成できますが、これは最も面倒な方法です。

編集:

.Net アンマネージ プロファイリング APIを使用してメソッド JIT をインターセプトし、JIT の前にメソッド本体を置き換える 4番目のオプションがあります。この手法は、静的メソッド、非仮想メソッド、さらにはシールされたクラスをモックするために、JustMock (Telerik) によってうまく使用されています。

于 2008-10-30T02:02:08.127 に答える
3

実行時に既存のメソッドを変更することはできませんが、その場で Code DOM を使用してメソッドを作成し、それを実行することはできます。または、コードの文字列を連結し、メモリ内でコンパイルして実行することもできます。

私は後者を自分で実行しました(メモリ、ランタイムでコンパイルおよび実行されるカスタムC#コードを許可したアプリ)。

于 2008-10-30T01:49:31.287 に答える
2

呼び出しの前後にアスペクトを追加する場合は、PostSharp を参照してください: http://www.postsharp.org/

于 2008-10-30T01:52:26.850 に答える
1

やや似たような質問が以前に尋ねられました(わかりました、それで私の解決策はやや似ていました)。 PostSharpについてはすでに説明しましたが、問題の調査中に興味深いと思ったCodeProjectに関するこの非常に適切なLinFuの記事もあります。

于 2008-10-30T03:51:00.997 に答える
0

任意の型に対してこれを行う予定はありますか? メソッドを属性で装飾するつもりはないと思います。

それを考えると、より良いアプローチは、型のスーパークラスで抽象メソッドを定義することだと思います。スーパー クラスのメソッドは定型メソッド コードを格納し、そのメソッドの個々の型の動作を抽象メソッドを介して具体的な実装に委任できます。

ただし、一般的に言えば、実行時にコード ファイルを作成し、動的アセンブリをコンパイルしない限り、実行しようとしていることができません。同じ結果に近い結果を得るために使用できる、はるかに実用的な OO の原則とパターンが存在する可能性があります。

于 2008-10-30T01:46:49.000 に答える