2016-12-28 103 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; 
      } 
     } 
    } 
}