代码之家  ›  专栏  ›  技术社区  ›  Steve Guidi

如何确定显式实现的MethodInfo对象引用了哪个接口?

  •  1
  • Steve Guidi  · 技术社区  · 16 年前

    我有一个 MethodInfo

    MethodInfo GetMethod()
    {
        return typeof(List<>).GetMethod(
            "System.Collections.IEnumerable.GetEnumerator",
            BindingFlags.Instance | BindingFlags.NonPublic);
    }
    

    我如何质疑这一点 方法信息 对象以获取其实现的接口类型 Type System.Collections.IEnumerable ? 这个 InterfaceMapping 结构提供了反向操作,得到 方法信息 对象的类型,该类型实现给定接口,因此该接口不起作用。

    请注意,这是一个人为的示例,因为我可以清楚地解析此信息的方法名。如果可能的话,我想避免这样做。

    3 回复  |  直到 16 年前
        1
  •  4
  •   itowlson    16 年前

    我不知道有什么直接的方法可以做到这一点,但显然可以反过来使用InterfaceMapping:迭代由方法的声明类型实现的所有接口,检查该方法是否在该接口的接口映射中:

    foreach (Type itf in method.DeclaringType.GetInterfaces())
    {
      if (method.DeclaringType.GetInterfaceMap(itf).TargetMethods.Any(m => m == method))
      {
        Console.WriteLine("match: " + itf.Name);
      }
    }
    

    虽然这看起来有点低效,但大多数类型实现的接口很少,所以这应该不是什么大问题。尽管它不是非常优雅,但我还是很感激!

        2
  •  1
  •   Aaronaught    16 年前

    InterfaceMap 结构,以及 将接口报告为 DeclaringType . 然后我修补了它,没有意识到它被微妙地破坏了,使用了你发布的获取数据的方法 MethodInfo .

    然而,好的一面是,这种微妙的差异导致人们意识到 方法信息 方法信息 对于实现方法,它们实际上不是相同的方法。经过进一步的思考,我确信你想做的事情是不可能可靠的。

    Public Overrides Function Baz() As String Implements IFoo.Foo, IBar.Bar
    

    这里有一个方法显式实现了两个接口方法。如果可以得到原始接口类,或者甚至原始接口方法,您会得到哪一个?你如何解决这个歧义?

    我不是CLR内部的专家,但我相信接口映射是单向的。当您隐式或显式地实现接口或方法时,编译器将创建一个映射 接口 实现,这就是它处理针对接口的方法调用所需的全部内容。

    System.Collections.IEnumerable.GetEnumerator ,这只是一个名字,实际上没有关于 System.Collections.IEnumerable

        3
  •  0
  •   Marcelo Cantos    16 年前

    尝试 MethodInfo.DeclaringType .