2010-08-03 201 views
16

考慮:C#接口繼承

public interface IA 
{ 
    void TestMethod(); 
} 

public interface IB : IA 
{ 
} 

爲什麼:

typeof(IB).GetMethods().Count() == 0; 

只是要清楚:

public class A 
{ 
    public void TestMethod() 
    { 
    } 
} 

public class B : A 
{ 
} 

typeof(B).GetMethods().Count(); 

不工作(返回5);

還有一個好處:

typeof(IB).BaseType == null 

回答

-1

你必須定義一些的BindingFlags到的getMethods()。

嘗試

typeof(IB).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).Count(); 
+3

我忘了BindingFlags,因爲他們沒有幫助;)。 – ppiotrowicz 2010-08-03 09:34:52

+1

綁定標誌在這種情況下不起作用。當涉及課程時他們會提供幫助。 – Manfred 2010-08-03 09:47:46

9

這似乎是功能的getMethods的設計。它不支持接口中的繼承成員。如果你想發現所有的方法,你需要直接查詢每種接口類型。

查看this MSDN article的社區內容部分。

11

這裏是獲取計數都IA和IB代碼:

var ibCount = typeof(IB).GetMethods().Count(); // returns 0 
var iaCount = typeof (IB).GetInterfaces()[0].GetMethods().Count(); // return 1 

注意,在生產代碼,我不會在代碼中使用GetInterfaces()[0]因爲通常在那裏我會用這個我不能假設我將始終至少有一個接口。

我也嘗試了的BindingFlags如下:

const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy; 
var ibCount = typeof(IB).GetMethods(bindingFlags).Count(); 

然而,這仍然會返回0作爲接口IB仍然沒有實現方法TestMethod()。界面IA呢。如果IAIB都是類,則使用綁定標誌將起作用。但是,在這種情況下,您將得到5的返回值。不要忘記,IA隱含地從類Object派生!

+0

感謝您的回答。我知道我可以迭代接口並從中獲取方法。 我的問題是爲什麼我不能這樣做。 – ppiotrowicz 2010-08-03 11:58:57

2

將IA視爲IB的接口,而不是其基礎。