这是一个棘手的问题。如果你有一个(非泛型)方法的MethodInfo
实例,它是在一个开放的泛型上获得的,你实际上可以使用它来重复关闭该方法(即,为封闭类型使用不同的泛型参数)。 Type
关键是使用晦涩的静态函数MethodInfo.GetMethodFromHandle(...)
:
完整的工作示例:
static class SomeType<T>
{
public static int NonGenericMethod() => typeof(T).MetadataToken;
};
如何使用:
static void demo()
{
var Topen = typeof(SomeType<>);
var mi_nope = Topen.GetMethod("NonGenericMethod"); // cannot 'Invoke' this.
/// ...later perhaps...
var Tclosed = Topen.MakeGenericType(typeof(ushort));
var mi_ok = MethodInfo.GetMethodFromHandle(mi_nope.MethodHandle, Tclosed.TypeHandle);
var ret = (int)mi_ok.Invoke(null, null); // --> 0x02000150
/// ...again with a different generic arg, reusing 'mi_wontInvoke' (and Topen)...
Tclosed = Topen.MakeGenericType(typeof(Guid));
mi_ok = MethodInfo.GetMethodFromHandle(mi_nope.MethodHandle, Tclosed.TypeHandle);
ret = (int)mi_ok.Invoke(null, null); // --> 0x020000eb
}
请注意,Tclosed
类型句柄(作为第二个参数传入)不仅仅是T
您最终想要参数化的类型参数的句柄。相反,您必须首先使用它T
来关闭原始Topen
(打开)泛型类型,然后使用生成的(关闭)泛型类型的句柄。
换句话说,如果不先显式关闭泛型类型,就无法关闭泛型方法。