Рассмотрим следующий тривиальный код:
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 методов с совершенно разными параметрами, поэтому необходим общий подход.