В C #, как лучше узнать, есть ли у класса свойство (используя отражение) - PullRequest
7 голосов
/ 06 февраля 2012

У меня есть класс

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

В отдельном коде у меня есть имя поля в виде строки (пусть в качестве примера используется «Год»).

Я хочу сделать что-то вроде этого

   if (Car.HasProperty("Year")) 

, чтобы выяснить, есть ли поле Year на автомобильном объекте.Это вернет true.

   if (Car.HasProperty("Model"))

вернет false.

Я вижу код для циклического просмотра свойств, но хотел посмотреть, существует ли более лаконичный способ определить, существует ли одно поле.

Ответы [ 2 ]

16 голосов
/ 06 февраля 2012

Этот метод расширения должен это делать.

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

Если вы хотите проверить неэкземплярные свойства, частные свойства или другие параметры, вы можете настроить значения BindingFlags в этом операторе.Ваш синтаксис использования не будет именно тем, что вы даете.Вместо:

if (typeof(Car).HasProperty("Year"))
9 голосов
/ 06 февраля 2012

Поскольку вы, похоже, ищете только public свойства, Type.GetProperty () может выполнить работу:

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

Если вы хотите дополнительно абстрагировать приведенный выше код, вы можете написать метод расширения для Type class:

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

Тогда используйте это так:

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

Если вы также хотите проверить наличие не public свойств, вам придется вызвать переопределение Type.GetProperties () , которое принимает аргумент BindingFlags, и отфильтровать результаты, как Дэвид М. в своем ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...