7

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

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

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

4

2 回答 2

19

您可以使用该IsSpecialName属性:

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

这将删除所有名称被编译器以某种方式特殊对待的方法。文档是这样说的:

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

于 2012-08-31T13:53:13.370 回答
9

怎么样:

var type = typeof(IRoadVehicle);

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

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

于 2012-08-31T13:55:22.847 回答