在为原生 dll 编写 P/Invoke 包装器时,我发现自己有很多看起来像这样的代码:
// Declare delegate types matching some callbacks in the dll
delegate void d1(T1, T1);
delegate void d2(T1,T2,T3);
// Some functions
void f1(T1 a, T2 b)
{
..
}
void f2(T1 a, T2 b, T3 c)
{
}
然后后来,
// Marshal some instantiated delegates into IntPtrs to pass to native dll
IntPtr a = Marshal.GetFunctionPointerForDelegate(new d1(f1));
IntPtr b = Marshal.GetFunctionPointerForDelegate(new d2(f2));
所以我最终得到了很多类似上面的代码。我认为使用通用函数进行一些重构可能会很好,如下所示:
static void foo<T>(ref IntPtr ptr, T f) where T: System.Delegate, new()
{
ptr = Marshal.GetFunctionPointerForDelegate(new T(f));
}
这将允许我写:
foo<d1>(a,f1);
foo<d2>(b,f2);
等等。它不编译!我试图在函数声明中添加一些类型约束,但无法让它工作。在这种情况下,这对我来说并不重要,因为重构几乎不是很重要,但我只是想知道我会如何做这样的事情?