Рассмотрим следующий тривиальный код:
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 в качестве потенциального решения. Насколько я могу судить, мне нужно получить MethodInfo для FooImplementation, получить его MethodBody, преобразовать его в DynamicMethod и ввести в него свой блок try-finally.
К сожалению, я совершенно не знаю, как это сделать. Кто-нибудь готов протянуть руку помощи? Или у вас есть другая (желательно более простая) идея?
Изменить: здесь вариант использования - отладка привязки OpenGL (http://www.opentk.com). Мы должны внедрить 2226 методов с совершенно разными параметрами, поэтому необходим общий подход.