2016-12-28 77 views
2

可用的接口方法列表我有一个A级为:获取的派生接口

public class A: ParentA, IA 
{ 
    public void func() 
    { 
    } 
    public void ConsumableMethod() 
    { 
    } 
    public void MethodA() 
    { 
    } 
    public void ConsumableMethodFromIB() 
    { 
    } 
} 

public interface IA : IB 
{ 
    void ConsumableMethod(); 
} 

public interface IB 
{ 
    void ConsumableMethodFromIB(); 
} 

public abstract class ParentA 
{ 
    public abstract void MethodA(); 

    public void MethodB() 
    { 
    } 
} 

我想的这是在接口IA的方法列表。对于这些我在做这样的事情:

var methods = typeof(IA).GetMethods(BindingFlags.Instance | BindingFlags.Static | 
       BindingFlags.Public | BindingFlags.NonPublic); 

通过调用上的getMethods一个,我得到的仅在A(即FUNC)声明的方法的列表,在父抽象类实现的方法(即MethodB)并实施接口方法(即ConsumableMethod & ConsumableMethodFromIB)。

我要的是在IA提供方法(包括IB方法)。我目前只通过调用IA上的GetMethods获得'ConsumableMethod'。我怎样才能得到'ConsumableMethodFromIB'?

+5

对不起,但我无法理解你要/不正是到这里。你能否请你更新你的问题,说'IA'是什么,'方法'返回什么,你期望它返回什么?另外,你在说什么*父抽象类?你的问题没有。而且,接口不能*实现另一个接口。它可以**扩展它,但从不*实现*。 – MarcinJuraszek

+0

您无法获取未实现的方法,因为在这些类中没有关于它们的元信息。 –

+0

它是在同一条线上。 http://stackoverflow.com/questions/10550970/how-to-do-proper-reflection-of-base-interface-methods –

回答

0

你可以找到你使用这一套方法/属性寻找什么:

  • typeof(A).GetInterfaces()
  • typeof(A).GetInterfaceMap(...)
  • MethodInfo.DeclaringType

,使差。

0

正如您已经注意到的,GetMethods不会返回“父”接口的方法。 GetMethods可能会返回继承的方法(除非您使用BindingFlags.DeclaredOnly标志) - 这就是为什么您在调用GetMethods类型A时看到所有这些方法的原因,它们都属于此类或从父类继承。

如果你想获得“父”接口的方法,你将不得不手动探索它们,就像这样:

static IEnumerable<MethodInfo> GetMethods(Type type) { 
    foreach (var method in type.GetMethods(BindingFlags.Instance | BindingFlags.Static | 
               BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)) { 
     yield return method; 
    } 
    if (type.IsInterface) { 
     foreach (var iface in type.GetInterfaces()) { 
      foreach (var method in GetMethods(iface)) { 
       yield return method; 
      } 
     } 
    } 
}