Получить PropertyInfo из свойства вместо имени - PullRequest
12 голосов
/ 08 июня 2010

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

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

Способ получить PropertyInfo для MyProperty будет:

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

Это отстой!

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

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

propertyof(MyClass.MyProperty);

Ответы [ 3 ]

6 голосов
/ 08 июня 2010

В данный момент вы можете использовать дерево выражений:

GetProperty<MyClass>(x => x.MyProperty)

, а затем высосать PropertyInfo в GetProperty (который вам нужно будет написать).Однако это несколько хрупко - во время компиляции нет никакой гарантии, что дерево выражений является только доступом к свойству.

Другой альтернативой является сохранение имен используемых вами свойств, которые могут быть легко протестированы модульно, иполагайтесь на это.

По сути, вам нужен мифический оператор infoof, о котором много раз говорила команда C #, но который до сих пор не сделал сокращения: (

1 голос
/ 14 сентября 2017

За время, прошедшее с момента публикации этого вопроса, C # 6 был выпущен с оператором nameof . Это позволяет получить доступ к свойству с помощью следующего

PropertyInfo myPropertyInfo = typeof(MyClass).GetProperty(nameof(MyClass.MyProperty));

Если вы переименуете свойство, этот код не будет компилироваться (на самом деле это произойдет, поскольку переименование также изменит эту строку кода, если переименование выполнено правильно).

0 голосов
/ 08 июня 2010

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

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