Получить PropertyInfo из свойства вместо имени
Скажем, например, у меня есть этот простой класс:
public class MyClass
{
public String MyProperty { get; set; }
}
Способ получения PropertyInfo для MyProperty будет следующим:
typeof(MyClass).GetProperty("MyProperty");
Это отстой!
Почему? Легко: он будет разорваться, как только я изменю имя свойства, ему нужно много специальных тестов, чтобы найти все места, где используется свойство как это, деревья рефакторинга и использования не могут найти такие виды доступа.
Нет ли способа правильно получить доступ к свойству? Что-то, что проверяется во время компиляции?
Мне понравилась бы такая команда:
propertyof(MyClass.MyProperty);
Ответы
Ответ 1
Проект Caliburn имеет хорошую реализацию того, что вы ищете, чтобы позаботиться о именах свойств INotifyPropertyChanged. Вы можете адаптировать код выражения к тому, что вам нужно сделать. Взгляните на класс Caliburn.Core.PropertyChangedBase.
Ответ 2
Ближайшим, к которому вы можете прийти в данный момент, является использование дерева выражений:
GetProperty<MyClass>(x => x.MyProperty)
а затем отсоедините PropertyInfo
в GetProperty
(который вам нужно будет записать). Тем не менее, это несколько хрупкое - нет никакой гарантии времени компиляции, что дерево выражений является только доступом к свойствам.
Другой альтернативой является сохранение имен свойств, которые вы используете где-то, которые могут быть легко проверены модулем, и полагаться на это.
В принципе, вам нужен мифический оператор infoof
, о котором много раз говорили команды С#, но который пока не сделал разреза: (
Ответ 3
За время, прошедшее с момента публикации этого вопроса, С# 6 был выпущен с nameof operator. Это позволяет получить доступ к ресурсу со следующими
PropertyInfo myPropertyInfo = typeof(MyClass).GetProperty(nameof(MyClass.MyProperty));
Если вы переименуете свойство, этот код не будет компилироваться (на самом деле это произойдет, поскольку переименование также изменит эту строку кода, если переименование выполнено правильно).
Ответ 4
Весь смысл размышлений - иметь доступ к материалам во время выполнения. Если мы предположим, что ваш оператор будет работать, у вас уже есть информация о классе и, следовательно, свойство, что делает все совершенно бесполезным.