0

.NET でリフレクションを使用してクラスに関数を追加することは可能ですか?

たとえば、2 つの Int32 を追加して結果を返すクラスに関数を追加するコードを記述できますか?

これは、そのような関数がシステムに既にコンパイルされていないことを前提としているため、JavaScript が「eval」を使用して行うのと同様に、基本的に文字列を関数に変換することを念頭に置いています (はい、それevalであることはわかっています)。 )。

4

3 に答える 3

3

いくつかの方法を使用して、実行時にアセンブリを作成できるはずです。

  • Roslyn (現在は CTP) を使用すると、任意の .NET コードをアセンブリにコンパイルでき、問題なく動作します。これは現在、実行時コード生成を行う最も簡単な方法です。

  • ILWeaving を使用すると、より難しい方法でそれを行うことができます。これは基本的に実行時にILコードを発行しており、新しいクラス/関数などを生成できるだけではありません。ただし、既存のものは変更できます。ILWeavingを介した INotifyPropertyChanged インターフェイスの実装が既にいくつかあります。これを行うには、 ILについて十分に理解している必要があります。

  • ある種のAspect フレームワークを使用します。これらのフレームワークが面倒な作業を行うため、IL コードを作成する必要はありません。通常、必要なコードはコンパイル時に生成されます。

  • 動的プロキシを使用すると、たとえば、クラスの既存のメソッド/関数の前/後に何かをすることに興味がある場合、既存のコードが何をするかを制御することもできます。

于 2012-09-27T00:13:10.773 に答える
1

You'd have to emit the class as well, so no you can't add, and it's painful as well.

Have a look at using a .NET dynamic languages Python, Ruby and even java (well ECMA) script are all available.

Based on your comment to Mitch's answer, another thing you might want to look at the is the AppDomain.AssemblyResolve event. You can do fun things like keep your assembly in a database blob with that.

You'll need to do some serious planning ahead with that route though.

于 2012-09-26T22:23:21.497 に答える
0

いいえ、そうではありません。すでにクラス内の関数から読み取ることしかできず、追加することはできません。とにかく、なぜあなたはする必要がありますか?現在のプログラムに追加したいコードを書くだけです。

于 2012-09-26T22:10:42.007 に答える