11

これはReflection.Emitを使用するかもしれないと思います。

しかし、SOに関する同様の質問は、クラス/メソッドを動的に作成する方法にのみ答え、既存のクラスを更新する方法には答えません。

同様に、実行時にメソッド/クラスを削除することは可能ですか?もしそうなら、クラスを削除して、古いメソッドと新しいメソッドを追加して戻すことができると思います。

前もって感謝します。

PS私はこれの使用目的を持っていません、それは単に好奇心の問題です。

4

2 に答える 2

30

通常のC#/ .NETでは、答えは単純な「いいえ」です。あなたができることのほとんどは、そのタイプのメソッド(プライベートフィールドへのアクセスなど)のように動作DynamicMethodできるを書くことですが、APIには決してありません-あなたはただデリゲートになってしまいます。

を使用するdynamicと、ほとんど何でもできます。メソッドの代わりにデリゲートExpandoObjectをアタッチすることでこれをエミュレートできますが、カスタム動的タイプではほとんど何でも実行できますが、これはAPIを使用する呼び出し元にのみ影響します。基本的な例:dynamicExpandoObject

dynamic obj = new ExpandoObject();
Func<int, int> func = x => 2*x;
obj.Foo = func;
int i = obj.Foo(123); // now you see it
obj.Foo = null; // now you don't

プロパティとイベント(メソッドではない)の場合、このアプローチを使用してSystem.ComponentModel実行時に表示される内容を変更できますが、これは、を介してアクセスする呼び出し元にのみ影響しますSystem.ComponentModel。つまり、主にUIデータバインディングです。これは、DataTable列を疑似プロパティとして表す方法です(現時点では「型付きデータセット」を忘れており、それらがなくても機能します)。

完全を期すために、拡張メソッドについても言及する必要があります。これらは、実行時のトリックではなく、コンパイラのトリックですが、「 add」の値が小さい場合は、既存の型にメソッドを追加できます。

ORMなどで一般的に使用される最後のトリックの1つは、型を動的にサブクラス化し、サブクラスに追加機能を提供することです。たとえば、プロパティをオーバーライドしてそれらをインターセプトします(遅延読み込みなど)。

于 2012-06-22T18:33:19.283 に答える
2

実行時にメソッド/クラスを削除することは可能ですか?

それが可能だったとしましょう。これらのメソッドの呼び出しは失敗し、未定義の(ただし通常は壊滅的な)動作を生成します。

だからそれは不可能だと確信しています。

于 2012-06-22T18:32:52.843 に答える