2011-01-17 18 views
1

私は(他のものの中でも)特定の空の仮想メソッド(イベントハンドラとして使用される)を定義する基本クラスを持っています。実行時にC#メソッド本体を定義する(動的に)

これまで、すべてのインスタンスは派生型から作成され、仮想メソッドをオーバーライドして寿命を埋めました。このタイプは動的に生成されていますが、私は本当にReflection(.Emit)か、.Netフレームワークが提供するどのようなレバーであれ、上記のメソッドの本体を変更することが可能かどうか本当に不思議です。

アイデア?

ありがとうございます!

答えて

1

本体をデリゲートを呼び出して、メソッドを仮想化してオーバーライドする代わりにデリゲートを変更することができます。

そして、そのメソッドの唯一の使用がイベントハンドラのようなものなら、どうしてそれをメソッドにするのですか?生成された関数をイベントハンドラに直接代入するだけです。

式ツリーを作成し、それをデリゲートにコンパイルしてイベントハンドラに割り当てることができます。

+0

ありがとう、私はあなたが大丈夫だと思います。既存のメソッドを呼び出す代わりに、私はイベントを呼び出すことができます。派生クラスは、それらのイベントのリスナーを指定することができるので、きれいで気の利いたものになります!あなたのご意見ありがとうございます! –

0

メソッドボディを埋め込むのではなく、デリゲートをコンストラクタに渡すのはなぜですか?デリゲートを動的に作成するのは比較的簡単です(たとえばDynamicMethod.CreateDelegate)。既存のタイプの変更について心配する必要はありません。

0

私が知る限り、コンパイル後に既存のコードを変更することは禁じられています。新しいコードを動的に追加することはできますが、既存のコードを変更することはできず、コンパイルされたコマンドとクラスやその他のデータ型の定義の両方に適用されます。

関連する問題