2012-08-31 20 views
5

Me gustaría usar el reflejo para mostrar una lista de métodos en una interfaz.Cómo listar métodos de interfaz omitiendo acceso a propiedades

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

utilizo siguiente código:

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

Sin embargo, también estar en la lista de los descriptores de acceso generados por el compilador si la interfaz tiene una propiedad. Me gustaría diferenciar entre los métodos explícitamente definidos y los usuarios de propiedades para omitir este último.

//output: 
//get_WheelCount 
//IsEmergency 

//desired output: 
//IsEmergency 

¿Cómo puedo filtrar los métodos relacionados con la propiedad?

+0

Los métodos de filtrado que comienzan por get_ o set_ no son suficientes para usted? – BlueM

+3

@BlueM alguien podría hacer algo tonto como nombrar un método real 'get_Thing()'. –

Respuesta

18

Puede utilizar el IsSpecialName propiedad:

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

Esto elimina todos los métodos con un nombre que se trata de alguna manera especial por el compilador. Los documentos dicen esto al respecto:

El bit SpecialName está configurado para marcar miembros que son tratados de manera especial por algunos compiladores (como los accesores de propiedad y los métodos de sobrecarga del operador).

+0

Esa es una propiedad bastante útil de conocer. – SomeWritesReserved

+0

Agradable. ¡IsSpecialName es algo bueno de saber! – BlueM

7

¿Qué tal:

var type = typeof(IRoadVehicle); 

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

También puede utilizar IsSpecialName como Daniel Hilgarth menciona, pero tenga en cuenta que esto también excluye otros métodos "especiales" como operadores (no es un problema para las interfaces) y por eventos accesadores. Depende de lo que quieras, realmente.

+0

Mucho más ordenado que 'IsSpecialName'. – ProfK

Cuestiones relacionadas