考虑以下简单代码:
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() 将 prologue 和 epilogue 方法添加到 Foo 委托。唉,这行不通,因为它会处理返回值。
我目前的想法是使用 System.Reflection.Emit 和 DynamicMethod 作为潜在的解决方案。据我所知,我需要获取 FooImplementation 的 MethodInfo,获取它的 MethodBody,将其转换为 DynamicMethod 并将我的 try-finally 块注入其中。
不幸的是,我完全不知道如何做到这一点。有人愿意伸出援手吗?还是您有另一个(最好更简单)的想法?
编辑:这里的用例是调试 OpenGL 绑定 (http://www.opentk.com)。我们必须注入 2226 个参数差异很大的方法,因此需要一个通用的方法。