如何确定哪个接口由一个明确的实施MethodInfo对象引用?
-
21-09-2019 - |
题
我有表示显式地实现的接口方法的MethodInfo
对象,如下:
MethodInfo GetMethod()
{
return typeof(List<>).GetMethod(
"System.Collections.IEnumerable.GetEnumerator",
BindingFlags.Instance | BindingFlags.NonPublic);
}
如何查询此MethodInfo
对象以获得它实现了接口类型,一个Type
对象表示System.Collections.IEnumerable
?的 InterfaceMapping
结构提供的逆操作,得到了实现给定接口,所以将无法正常工作的类型MethodInfo
对象。
请注意,这是一个人为的例子如我可以清楚地了解此信息解析方法名。我想尽可能避免这样做。
解决方案
我不知道这样做的一个直接的方法,但可以很明显的反向使用InterfaceMapping:遍历该方法的声明类型实现的所有接口,检查是否该方法是在接口映射该接口:
foreach (Type itf in method.DeclaringType.GetInterfaces())
{
if (method.DeclaringType.GetInterfaceMap(itf).TargetMethods.Any(m => m == method))
{
Console.WriteLine("match: " + itf.Name);
}
}
尽管这似乎有点效率低下,大多数类型的实现几个足够的接口,它不应该是一个大问题。欣赏它并不十分优雅,但!
其他提示
对不起我的第一个回答,首先我想从InterfaceMap
结构获得的方法,并在是的结构实际上做报告的接口作为DeclaringType
方法。然后,我修修补补它并使用你张贴的方法来获取MethodInfo
并没有意识到这是巧妙地打破。
在颠倒,不过,是这种微妙的差别导致了实现该MethodInfo
的界面的方法,和用于实现方法的MethodInfo
,实际上不是相同的方法。而在进一步的思考,其实我敢肯定,你想做的事是不可能可靠地做。
显式接口的实现是有点超过它确实有效的CLR的方式语法糖。在其他语言中,一个具体的方法可以实现多个接口方法的一个具体的类可以实现多个接口类型相同的方式。例如,在VB.NET,这是完全合法的做到这一点:
Public Overrides Function Baz() As String Implements IFoo.Foo, IBar.Bar
在这里,你有一个方法,进行了明确实现两个接口方法。如果能够得到原始接口类 - 甚至原来的接口方法 - 你会得到哪一个?你如何解决歧义?
我不是在CLR内部的专家,但我相信,接口映射是单向的。当你实现一个接口或方法,或明或暗地,编译器创建一个映射的从的接口的到的实施,这是以往任何时候都需要处理所有的方法都反对接口
的C# - 生成方法名看作是几乎巧合。虽然方法名称为System.Collections.IEnumerable.GetEnumerator
,真的只是一个名字,并没有真正了解方法本身编码System.Collections.IEnumerable
的任何信息。
尝试MethodInfo.DeclaringType
。