获取已实现泛型类的泛型方法定义

本文关键字:泛型方法 定义 泛型类 实现 获取 | 更新日期: 2023-09-27 18:12:11

public class Target3<T,T2>
{
    T GetTGenericTest(T2 obj);
}

在上面的代码中,GetTGenericTest不是泛型方法,所以MakeGenericMethod当然不能使用。那么,当我有一个属于IInterfaceTarget3<string,int>对象的MethodInfo时,我该怎么做才能将其恢复到未定义的版本?我不能只使用 MakeGenericType,因为那样我就无法将当前MethodInfo链接到未定义的。

(伪代码以保持简短(

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);
}

获取已实现泛型类的泛型方法定义

如果在泛型类中有一个非泛型方法,则在泛型类定义中将其"转换"为非泛型方法并不容易。但这可以解决问题:

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);