代码之家  ›  专栏  ›  技术社区  ›  Krzysztof Kozmic

如何获取接口方法的MethodInfo,有没有实现类方法的MethodInfo?

  •  24
  • Krzysztof Kozmic  · 技术社区  · 15 年前

    我有一个 MethodInfo 一个 界面 方法及 Type A的 实现了 界面 . 我想找到 方法信息 实现接口方法的类方法。

    简单的 method.GetBaseDefinition() 不适用于接口方法。 按名称查找也不起作用,因为显式实现接口方法时,它可以有任何名称(是的,不在C中)。

    那么什么是 对的 这样做的方式涵盖了所有的可能性?

    2 回复  |  直到 6 年前
        1
  •  35
  •   Krzysztof Kozmic    6 年前

    好吧,我找到了一个方法,用 GetInterfaceMap .

    var map = targetType.GetInterfaceMap(interfaceMethod.DeclaringType);
    var index = Array.IndexOf(map.InterfaceMethods, interfaceMethod);
    
    if (index == -1)
    {
        //this should literally be impossible
    }
    
    return map.TargetMethods[index];
    
        2
  •  1
  •   Rob Levine    15 年前

    嗯-不确定 对的 方法,但您可以通过循环遍历类型上的所有接口,然后在接口中搜索该方法来实现。不确定是否可以在不循环通过接口的情况下直接执行,因为在没有getBaseDefinition()的情况下有点卡住了。

    对于使用单一方法(MyMethod)和实现此方法的类型(MyClass)的接口,我可以使用以下方法:

    MethodInfo interfaceMethodInfo = typeof(IMyInterface).GetMethod("MyMethod");
    MethodInfo classMethodInfo = null;
    Type[] interfaces = typeof(MyClass).GetInterfaces();
    
    foreach (Type iface in interfaces)
    {
        MethodInfo[] methods = iface.GetMethods();
    
        foreach (MethodInfo method in methods)
        {
            if (method.Equals(interfaceMethodInfo))
            {
                classMethodInfo = method;
                break;
            }
        }
    }
    

    如果这两个方法的名称不同,则必须检查MethodInfo.Equals是否有效。我甚至不知道这是可能的,可能是因为我是个骗子。