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