2012-08-31 45 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

相关问题