如何列出省略属性访问器的接口方法

我想使用reflection来显示接口中的方法列表。

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 

如何过滤掉与属性相关的方法?

您可以使用IsSpecialName属性:

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

这将删除所有具有名称的方法,该名称由编译器以某种方式处理。 文档说明了这一点:

SpecialName位设置为标记某些编译器以特殊方式处理的成员(例如属性访问器和运算符重载方法)。

怎么样:

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

您也可以像Daniel Hilgarth提到的那样使用IsSpecialName,但请注意,这也将排除其他“特殊”方法,如运算符(不是接口问题)和事件访问器。 真的,取决于你想要的东西。