2012-08-31 1 views
5

Vorrei utilizzare il reflection per visualizzare un elenco di metodi in un'interfaccia.Come elencare i metodi di interfaccia che omettono gli accessor di proprietà

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

Io uso seguente codice:

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

Tuttavia, ho anche ottenere elencati i accesso alle proprietà generati dal compilatore se l'interfaccia ha una proprietà. Vorrei distinguere tra metodi esplicitamente definiti e accessori di proprietà per omettere il secondo.

//output: 
//get_WheelCount 
//IsEmergency 

//desired output: 
//IsEmergency 

Come è possibile filtrare i metodi relativi alle proprietà?

+0

I metodi di filtro che iniziano per get_ o set_ non sono sufficienti per te? – BlueM

+3

@BlueM qualcuno potrebbe fare qualcosa di sciocco come il nome di un vero metodo 'get_Thing()'. –

risposta

18

È possibile utilizzare la proprietà IsSpecialName:

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

Questo rimuove tutti i metodi con un nome che viene trattato in qualche modo speciale dal compilatore. I documenti lo dicono al riguardo:

Il bit SpecialName è impostato per contrassegnare i membri che sono trattati in modo speciale da alcuni compilatori (come i metodi di accesso alle proprietà e l'overloading dell'operatore).

+0

Questa è una proprietà molto utile da conoscere. – SomeWritesReserved

+0

Bello. IsSpecialName è qualcosa di buono da sapere! – BlueM

7

ne dite:

var type = typeof(IRoadVehicle); 

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

È inoltre possibile utilizzare IsSpecialName come Daniele Hilgarth menziona, ma si noti che questo sarà anche escludere altri metodi "speciali" come operatori (non è un problema per le interfacce) e event- di accesso. Dipende da cosa vuoi, davvero.

+0

Molto più ordinato di "IsSpecialName". – ProfK