Как получить имя свойства C # в виде строки с отражением?

Возможный дубликат:
c # - Как получить имя переменной, которое было физически введено в ее объявлении?

Я ищу способ получить имя свойства в виде строки, чтобы получить «строго типизированную» магическую строку. Мне нужно сделать что-то вроде MyClass.SomeProperty.GetName (), который вернет SomeProperty. Возможно ли это в C #?


person Jim Mitchener    schedule 03.11.2009    source источник


Ответы (3)


Вы можете легко добиться этого с помощью выражений. См. Образец в этом блоге.

Это позволяет создать выражение с помощью лямбда-выражения и извлечь имя. Например, реализация INotifyPropertyChanged может быть переработана, чтобы сделать что-то вроде:

public int MyProperty {
    get { return myProperty; }
    set
    {
        myProperty = value;
        RaisePropertyChanged( () => MyProperty );
    }
}

Чтобы сопоставить свой эквивалент, используя указанный класс «Reflect», вы должны сделать что-то вроде:

string propertyName = Reflect.GetProperty(() => SomeProperty).Name;

Альт - названия свойств без волшебных строк.

person Reed Copsey    schedule 03.11.2009
comment
Синтаксис здесь немного неприятный, но он делает то, что мне нужно. Спасибо! - person Jim Mitchener; 03.11.2009

Этот подход будет намного быстрее, чем использование Expression

public static string GetName<T>(this T item) where T : class
{
    if (item == null)
        return string.Empty;

    return typeof(T).GetProperties()[0].Name;
}

Теперь вы можете назвать это:

new { MyClass.SomeProperty }.GetName();

Вы можете кэшировать значения, если вам нужна еще большая производительность. См. Этот повторяющийся вопрос Как получить имя переменной в том виде, в каком оно было физически введено в ее объявлении?

person nawfal    schedule 04.02.2013
comment
Лучший ответ здесь. Я не хочу зацикливать свойства, я хочу получить имя свойства на основе фактического свойства. Использование анонимного типа с первым (единственным) свойством, являющимся тем, из которого вы хотите получить имя, - это гениально. - person Paul; 12.06.2014
comment
@ Пол Я не гений, стоящий за этим. Во-вторых, это не очень удобно для рефакторинга. Я имею в виду, что если вы измените имя свойства, анонимный тип сохранит исходное имя. В этом случае, если вы измените SomeProperty на SomeProperty1, анонимный класс изменится на new { SomeProperty = SomeProperty1 }, который будет печатать SomeProperty вместо обновленного имени SomeProperty1. Упомяну в ответе. - person nawfal; 12.06.2014
comment
Штопать. Я не ожидаю, что когда-нибудь изменит имя свойства, но если бы я когда-нибудь это сделал, мне бы хотелось, чтобы рефакторинг справился с этим. Спасибо, что дал мне знать. - person Paul; 12.06.2014
comment
Это также не удастся, если MyClass имеет значение NULL во время выполнения. Подходы к экспрессии будут успешными. В подавляющем большинстве случаев это не будет проблемой, потому что вы получите исключение нулевой ссылки где-то еще, но, вероятно, стоит указать на это. - person Rakuen42; 20.03.2015
comment
@ Pedro77 вы должны сначала написать метод расширения в статическом классе. - person nawfal; 09.06.2015

Вы можете получить список свойств объекта с помощью отражения.

MyClass o;

PropertyInfo[] properties = o.GetType().GetProperties(
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance
);

У каждого свойства есть атрибут Name, который даст вам "SomeProperty".

person David    schedule 03.11.2009