2012-02-06 11 views
5

Mam klasyW języku C#, co jest najlepszym sposobem, aby dowiedzieć się, jeśli klasa ma właściwość (przy użyciu odbicia)

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

w kodzie indywidualne, mam nazwę pola jako jako ciąg (niech korzystania "Rok") jako przykład.

Chcę zrobić coś takiego

if (Car.HasProperty("Year")) 

które dowiedzieć się, czy istnieje pole Rok na obiekcie samochodowym. To by się powróciło.

if (Car.HasProperty("Model")) 

zwróci wartość false.

Widzę kod do przechodzenia między właściwościami, ale chciał sprawdzić, czy istnieje bardziej zwięzły sposób ustalenia, czy istnieje jedno pole.

+4

Czy "HasProperty" nie byłoby lepszą nazwą metody? –

Odpowiedz

15

Ta metoda rozszerzenia powinna to zrobić.

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

Jeśli chcesz sprawdzić właściwości niż przykład, właściwości fizycznych, lub innych opcji, można dostosować wartości BindingFlags w tym piśmie. Twoja składnia użycia nie będzie dokładnie tym, co dajesz. Zamiast tego:

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

Ponieważ wydaje się, że patrzy tylko na public właściwości Type.GetProperty() może wykonać zadanie:

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

Jeśli chcesz dalej streszczenie kod powyżej, można napisać metodę rozszerzenia na Type class:

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

następnie używać go tak:

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

Jeśli chcesz również sprawdzić obecność właściwości innych niż public, będziesz musiał wywołać zastąpienie Type.GetProperties(), które pobiera argument BindingFlags i odfiltrować wyniki, jakie robi David M w swojej odpowiedzi.

Powiązane problemy