Ссылаясь на само свойство в C #. Отражение? Generic? Тип? - PullRequest
5 голосов
/ 13 мая 2009

Пожалуйста, потерпите меня, если этот вопрос не сформулирован правильно. Незнание - это часть проблемы.

Пример того, чего я хотел бы достичь, можно найти в PropertyChangedEventArgs в WPF. Если вы хотите отметить, что свойство изменилось в WPF, вы делаете это так:

PropertyChanged(this, new PropertyChangedEventArgs("propertyName"));

Вы передаете строку в PropertyChangedEventArgs, которая ссылается на имя свойства , которое изменилось.

Вы можете себе представить, что мне не нужны жестко закодированные строки для имен свойств во всем моем коде. Конечно, Refactor-rename пропускает его, что делает его не только эстетически непривлекательным, но и подверженным ошибкам.

Я бы предпочел сослаться на само свойство ... как-нибудь.

PropertyChanged(this, new PropertyChangedEventArgs(?SomeClass.PropertyName?));

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

private void MyPropertyChanged(??) {
  PropertyChanged(this, new PropertyChangedEventArgs(??.ToString()??));
}

... so I can say something like:
MyPropertyChanged(Person.Name); //where I'm interested in the property *itself*

Пока я рисую бланк.

Ответы [ 3 ]

6 голосов
/ 13 мая 2009

К сожалению, прямого способа сделать это не существует; однако вы можете сделать это в .NET 3.5 через Expression. Подробнее см. Здесь . Чтобы скопировать пример:

PropertyInfo prop = PropertyHelper<Foo>.GetProperty(x => x.Bar);

(это довольно просто изменить, чтобы вернуть имя вместо PropertyInfo).

Аналогично, было бы довольно просто написать вариант:

OnPropertyChanged(x=>x.Name);

с помощью:

OnPropertyChanged<T>(Expression<Func<MyType,T>> property) {...}
1 голос
/ 13 мая 2009

Я вполне уверен, что нет способа избежать указания строки - в C # или .NET нет встроенной функции, позволяющей вам передавать ссылки на свойства, насколько мне известно, и передавать string в Reflection API, безусловно, будет самым простым методом.

Однако за пределами стандартного .NET вы можете найти свое решение в PostSharp (Аспектно-ориентированное программирование для .NET), которое позволяет вам добавлять код, который автоматизирует создание событий при изменении различных свойств, как у вас есть продемонстрировано в вашем вопросе.

1 голос
/ 13 мая 2009

Это часто запрашиваемая функция, обычно называемая infoof («информация о»), которая возвращает объект отражения, связанный с элементом, например,

PropertyInfo pi = infoof(Person.Name);

К сожалению, динамическое ключевое слово поглощает время команды компилятора C #!

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