2012-03-09 73 views
3

有沒有辦法獲得接口成員列表?我知道System.Reflection.MemberInfo,但它包含了對象中的所有內容,而不僅僅是某個接口。如何獲得接口成員列表

這裏是程序,我不知道如何讓你的界面,因爲我沒有寫它,但它是Ascom標準(http://ascom-standards.org)的一部分。

public static void Test1() 
{ 
    Console.WriteLine("mark1"); // this shows up... 
    var type = typeof(Ascom.Interface.ITelescope); 
    var members = type.GetMembers(); 
    Console.WriteLine(members.Count); // gives 0 
    foreach (var member in members) 
    { 
     Console.WriteLine(member.Name); //nothing from here 
    } 
    Console.WriteLine("mark4"); // ...as well as this 
} 
+0

爲了說明問題,您有兩個'Type'對象,一個用於'class'(或'struct'),另一個用於'interface',並且您想獲得在類中實現接口的方法。是對的嗎?你爲什麼要他們? – svick 2012-03-09 21:32:18

+0

我只想要接口列表。我試圖在運行時動態實現接口,fyi。 – 2012-03-09 21:43:12

+0

糟糕,界面*成員*列表。 – 2012-03-09 22:12:16

回答

2

如果它是一個COM接口,那麼你應該禁用「嵌入互操作類型」,否則只會在裝配插入使用的部件。我猜你不會在程序集中使用該接口的任何方法/屬性,這就是爲什麼他們永遠不會被插入,所以你可以用反射來列出它們。 (Thx OWO)

7

從MSDN:

typeof(IList).GetMembers() 

獲取當前類型的成員(屬性,方法,字段,事件,等等)。

2

你只需要問的成員的接口類型

var type = typeof(IConvertible); 
var members = type.GetMembers(); 

foreach (var member in members) 
{ 
    Console.WriteLine(member.Name); // ToInt32 etc 
} 
+0

我試過這個,它不會返回任何東西。 – 2012-03-09 21:49:33

+0

@Arlene Beiler:對於哪個界面?它適用於我...我用我發佈的代碼嘗試過。 – 2012-03-09 21:50:18

+0

與接口被標記爲公共而不是其成員有什麼關係?當我在對象瀏覽器中瀏覽它時,它說接口是公共的,但沒有一個成員被標記爲公共的。 – 2012-03-09 21:51:29

2
var t = typeof(IMyInterface); 
foreach(var m in t.GetMethods()){ 
    Debug.WriteLine(m.Name); 
} 
1

爲了得到一些接口的成員列表,你可以這樣做:列表成員正如其他人指出的那樣:

var members = interfaceType.GetMembers(); 

但是如果你想知道某些類型的成員實現該接口,您可以使用GetInterfaceMap()和檢查the TargetMethods field

var members = type.GetInterfaceMap(interfaceType).TargetMethods;