Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to list interface methods omitting property accessors [duplicate]

I would like to use reflection to display a list of methods in an interface.

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

I use following code:

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

However, I also get listed the compiler-generated property accessors if the interface has a property. I would like to differentiate between explicitly-defined methods and property accessors to omit the latter.

//output:
//get_WheelCount
//IsEmergency

//desired output:
//IsEmergency

How can I filter out the property-related methods?

like image 920
nan Avatar asked Aug 31 '12 13:08

nan


2 Answers

You can use the IsSpecialName property:

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

This removes all methods with a name that is treated somehow special by the compiler. The docs say this about it:

The SpecialName bit is set to flag members that are treated in a special way by some compilers (such as property accessors and operator overloading methods).

like image 161
Daniel Hilgarth Avatar answered Nov 03 '22 00:11

Daniel Hilgarth


How about:

var type = typeof(IRoadVehicle);

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

You can also use IsSpecialName like Daniel Hilgarth mentions, but note that this will also exclude other "special" methods like operators (not an issue for interfaces) and event-accessors. Depends on what you want, really.

like image 36
Ani Avatar answered Nov 02 '22 23:11

Ani