Подтвердить что ты не робот

Получить PropertyInfo из свойства вместо имени

Скажем, например, у меня есть этот простой класс:

public class MyClass
{
  public String MyProperty { get; set; }
}

Способ получения PropertyInfo для MyProperty будет следующим:

typeof(MyClass).GetProperty("MyProperty");

Это отстой!

Почему? Легко: он будет разорваться, как только я изменю имя свойства, ему нужно много специальных тестов, чтобы найти все места, где используется свойство как это, деревья рефакторинга и использования не могут найти такие виды доступа.

Нет ли способа правильно получить доступ к свойству? Что-то, что проверяется во время компиляции?
Мне понравилась бы такая команда:

propertyof(MyClass.MyProperty);
4b9b3361

Ответ 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

Весь смысл размышлений - иметь доступ к материалам во время выполнения. Если мы предположим, что ваш оператор будет работать, у вас уже есть информация о классе и, следовательно, свойство, что делает все совершенно бесполезным.