次の些細なコードを考えてみましょう。
using System;
class Test
{
delegate int FooDelegate(int i);
FooDelegate Foo = FooImplementation;
static int FooImplementation(int i)
{
return i + 1;
}
public static void Main()
{
Foo(1);
}
}
私がやりたいのは、Fooデリゲートにデバッグコードを挿入することです。これは次のようになります。
FooDelegate Foo = delegate(int i)
{
try
{
DebugPrologue();
return FooImplementation(i);
}
finally
{
DebugEpilogue();
}
};
ツイストは、実行時にこれを実行できる必要があるため、コンパイル時と後処理の方法は問題外です。
私の最初のアプローチでは、Delegate.Combine()を使用して、プロローグメソッドとエピローグメソッドをFooデリゲートに追加しました。残念ながら、これは戻り値を変更するため機能しません。
私の現在のアイデアは、潜在的なソリューションとしてSystem.Reflection.EmitとDynamicMethodを使用することです。私が知る限り、FooImplementationのMethodInfoを取得し、そのMethodBodyを取得し、それをDynamicMethodに変換して、try-finallyブロックをそれに挿入する必要があります。
残念ながら、これを行う方法がまったくわかりません。手を貸してくれる人はいますか?または、別の(できればもっと単純な)アイデアがありますか?
編集:ここでのユースケースは、OpenGLバインディング(http://www.opentk.com)のデバッグです。パラメータが大きく異なる2226メソッドを注入する必要があるため、一般的なアプローチが必要です。