2012-02-06 10 views
5

tengo una claseEn C#, ¿cuál es la mejor manera de averiguar si una clase tiene una propiedad (utilizando la reflexión)

public class Car 
{ 
     public string Name {get;set;} 
     public int Year {get;set;} 
} 

En el código independiente, tengo un nombre de campo que como cadena (por no uso "Año") como un ejemplo.

quiero hacer algo como esto

if (Car.HasProperty("Year")) 

que averiguar si hay un campo en el objeto de Año coche. Esto volvería verdadero.

if (Car.HasProperty("Model")) 

devolvería falso.

Veo el código para recorrer las propiedades, pero quería ver si existía una manera más concisa de determinar si existe un solo campo.

+4

¿No 'HasProperty' sería un mejor nombre para el método? –

Respuesta

15

Este método de extensión debería hacerlo.

static public bool HasProperty(this Type type, string name) 
{ 
    return type 
     .GetProperties(BindingFlags.Public | BindingFlags.Instance) 
     .Any(p => p.Name == name); 
} 

Si quería comprobar si las propiedades no ejemplo, propiedades privadas, u otras opciones, puede modificar los valores de BindingFlags en esa declaración. Su sintaxis de uso no sería exactamente lo que da. En cambio:

if (typeof(Car).HasProperty("Year")) 
8

Ya que parece estar buscando sólo para public propiedades, Type.GetProperty() puede hacer el trabajo:

if (typeof(Car).GetProperty("Year") != null) { 
    // The 'Car' type exposes a public 'Year' property. 
} 

Si desea más abstracto que el código anterior, se puede escribir un método de extensión en el Type class:

public static bool HasPublicProperty(this Type type, string name) 
{ 
    return type.GetProperty(name) != null; 
} 

Entonces utilizar de esta manera:

if (typeof(Car).HasPublicProperty("Year")) { 
    // The 'Car' type exposes a public 'Year' property. 
} 

Si también desea verificar la presencia de propiedades que no sean public, deberá llamar a la anulación del Type.GetProperties() que toma un argumento BindingFlags, y filtrar los resultados como lo hace David M en su respuesta.

Cuestiones relacionadas