如何通过反射判断子接口显式实现的父接口对应方法
判断反射获取的方法是否为接口方法的实现
给定以下C#接口定义:
public interface IDeclaring { string GetValue(); } public interface IImplementing : IDeclaring { string IDeclaring.GetValue() => "IDerived"; }
在编写运行时实现接口的库时,需要通过反射判断IImplementing中获取的MethodInfo(implementingMethodInfo)是否是IDeclaring中GetValue方法(declaringMethodInfo)的显式实现。由于MethodInfo.GetBaseDefinition对接口方法不适用,可通过以下可靠方式实现判断:
核心解决方案:利用接口映射(InterfaceMapping)
.NET提供的Type.GetInterfaceMap方法可直接获取类型与接口之间的方法映射关系,这是判断接口方法实现的官方推荐方式,能覆盖所有边界情况。
实现代码
public static bool IsInterfaceMethodImplementation(MethodInfo implementingMethod, MethodInfo interfaceMethod) { // 前置校验:接口方法必须来自接口类型,且实现方法所在类型必须实现该接口 if (!interfaceMethod.DeclaringType.IsInterface) return false; if (!interfaceMethod.DeclaringType.IsAssignableFrom(implementingMethod.ReflectedType)) return false; // 获取当前类型与目标接口的方法映射 InterfaceMapping mapping = implementingMethod.ReflectedType.GetInterfaceMap(interfaceMethod.DeclaringType); // 查找接口方法在映射中的索引 int methodIndex = Array.IndexOf(mapping.InterfaceMethods, interfaceMethod); if (methodIndex == -1) return false; // 对比映射中对应的实现方法是否为当前传入的方法 return mapping.TargetMethods[methodIndex] == implementingMethod; }
原理说明
InterfaceMapping结构包含两个关联数组:InterfaceMethods:接口中定义的所有方法的MethodInfo数组TargetMethods:实现类型中对应实现上述接口方法的MethodInfo数组
两个数组的索引一一对应,即InterfaceMethods[i]的实现就是TargetMethods[i]。
- 显式接口实现的方法在反射中会标记为
IsPrivate = true,且其DeclaringType为对应的接口类型(而非实现接口的类型),但通过接口映射仍能准确关联到对应的实现方法。
额外说明
若自行校验签名(方法名、返回类型、参数类型及修饰符),容易遗漏泛型方法、ref/out参数、自定义修饰符等细节,而使用InterfaceMapping能规避这些问题,是更稳定的方案。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

