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

在上面的代码中,GetTGenericTest不是GenericMethod,所以MakeGenericMethod当然不能用。那么,当我有一个MethodInfo属于 的对象时IInterfaceTarget3<string,int>,我该怎么做才能将它恢复到它的未定义版本?我不能只使用 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);
}
4

1 回答 1

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);
于 2013-05-04T15:11:45.317 回答