2012-08-31 44 views
5

我想使用反射顯示接口中的方法列表。如何列出省略屬性訪問器的接口方法

public interface IRoadVehicle 
{ 
    int WheelCount { get; } 
    bool IsEmergency(); 
} 

我用下面的代碼:

foreach (var m in typeof(IRoadVehicle).GetMethods()) 
{ 
    Console.WriteLine(m.Name); 
} 

不過,我也可以上市編譯器生成的屬性訪問器如果接口有一個屬性。我想區分顯式定義的方法和屬性訪問器以省略後者。

//output: 
//get_WheelCount 
//IsEmergency 

//desired output: 
//IsEmergency 

如何過濾出與屬性相關的方法?

+0

以get_或set_開頭的過濾方法對您而言是不夠的? – BlueM

+3

@BlueM有人可以做一些愚蠢的事情,比如說一個真正的方法'get_Thing()'。 –

回答

18

可以使用IsSpecialName屬性:

foreach (var m in typeof(IRoadVehicle).GetMethods().Where(x => !x.IsSpecialName)) 
{ 
    // ... 
} 

這消除了與由編譯器處理莫名其妙特殊名稱的所有方法。文檔說明了這一點:

SpecialName位設置爲標記由某些編譯器(例如屬性訪問器和運算符重載方法)以特殊方式處理的成員。

+0

這是一個非常方便的財產知道。 – SomeWritesReserved

+0

不錯。 IsSpecialName是一件很好的事情! – BlueM

7

如何:

var type = typeof(IRoadVehicle); 

var accessors = type.GetProperties().SelectMany(property => property.GetAccessors()); 
var methods = type.GetMethods() 
        .Except(accessors); 

您還可以使用IsSpecialName像丹尼爾Hilgarth提到,但請注意,這也將排除像運營商等「特殊」的方法(不是接口問題)和事件存取。取決於你想要的,真的。

+0

比'IsSpecialName'更整齊。 – ProfK

相關問題