14

我需要能够确定给定的方法或属性是否来自特定接口并被显式实现
有没有人这样做过,实际上是否可以通过 .NET 反射获得这些信息?


更新

从接受的答案下方的评论中可以看出,我真正想要完成的事情是调用通过反射实现特定接口的方法。由于可能有多个具有相同方法签名的接口,我想根据接口确定要调用的正确实现。在我的场景中,实现类型、接口和方法名称是在运行时确定的,所以我不能使用简单的转换。

4

2 回答 2

17

C# 中显式实现的接口方法在目标类中是私有的。您可以使用此事实并创建此扩展方法以仅返回以下方法:

static IEnumerable<MethodInfo> GetExplicitlyImplementedMethods(this Type targetType, 
    Type interfaceType) 
{ 
  return targetType.GetInterfaceMap(interfaceType).TargetMethods.Where(m => m.IsPrivate);
}

注意:这适用于 C# 。

更新:但是,根据您的要求,您似乎只想知道哪些方法实现了哪些接口方法,而不真正关心实现是隐式的还是显式的。对于跨语言工作的解决方案,这就足够了:

static IEnumerable<MethodInfo> GetImplementedMethods(this Type targetType,
    Type interfaceType) 
{ 
  return targetType.GetInterfaceMap(interfaceType).TargetMethods;
}
于 2011-07-04T14:32:59.557 回答
1

如果在使用反射时,方法是私有的并且它的名称包含一个 .,例如“System.IDisposable.Dispose”,那么它就是一个显式实现。

于 2014-08-11T12:44:56.037 回答