public class Target3<T,T2>
{
T GetTGenericTest(T2 obj);
}
在上面的代码中,GetTGenericTest
不是GenericMethod,因此当然不能使用MakeGenericMethod
。
因此,当我有MethodInfo
属于IInterfaceTarget3<string,int>
的对象时,我该怎么做才能将其恢复为未定义的版本?
我不能只使用MakeGenericType,因为那时我无法将当前MethodInfo
链接到未定义的。{/ p>
(保持简短的伪代码)
List<MethodInfo> undefs = new List<MethodInfo>();
void X()
{
Type t = Typeof(Target3<,>);
MethodInfo undefMi = t.GetMethod("GetTGenericTest");
undefs.Add(undefMi);
}
void Y()
{
var obj = new Target3<string,int>();
MethodInfo defMi = obj.GetType().GetMethod("GetTGenericTest");
//How to do this?
MethodInfo undefMi = undefs.FirstOrDefault(u=> defMi.UndefinedVersion() == u);
}
答案 0 :(得分:4)
如果泛型类中有非泛型方法,则在通用类定义中将其“转换”为非泛型方法并不容易。但这样做可以解决问题:
MethodInfo mi1 = typeof(Target3<string, int>).GetMethod("GetTGenericTest");
MethodInfo mi2 = mi1.DeclaringType.GetGenericTypeDefinition().GetMethod(
mi.Name,
(mi.IsStatic ? BindingFlags.Static : BindingFlags.Instance) |
(mi.IsPublic ? BindingFlags.Public : BindingFlags.NonPublic),
null,
mi.GetParameters().Select(p => p.ParameterType).ToArray(),
null);