This question already has an answer here:
Closed 6 years ago.
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?
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).
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.