передать свойства как ссылку, используя выражения - PullRequest
2 голосов
/ 03 апреля 2011

Эта публикация сведений об обходных путях для передачи свойств в качестве ссылок, включая использование выражений, таких как

  public void StoreProperty(Expression<Func<T, object>> expr)

Этот подход приемлем, и я отмечаю, что многие фреймворки используют его (например, automapper, autofac), как подробно описано в Джеймсе Грегори "Введение в статическое отражение" , где он заявляет

Самое замечательное в том, что если вы измените имя члена внутри лямбды,вы получите ошибку компиляции, если вы не обновили все ссылки!Больше никаких скрытых ошибок.

Хотя я очень предпочитаю этот подход, он все еще не совершенен, так как вы можете передать любое выражение, возвращающее объект (или что бы то ни было, ваше возвращаемое значение), например

 x => x.Name) //fine
 x => x.Name+"x")  //runtime error

Существует ли в настоящее время лучший способ ссылки на свойство (путем блокировки выражения или каким-либо другим способом)

Если нет, как будущая версия C # может заблокировать выражение?например, что-то вроде:

public void StoreProperty(Expression<Func<T, object>> expr) where expr.Member is PropertyInfo

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

1 Ответ

2 голосов
/ 04 апреля 2011

Ну, я не понимаю, как это было бы возможно.

Я бы не сказал, что это «возмутительно», это просто не предполагаемое использование.На самом деле вся эта концепция, хотя и очень полезная в этой ситуации, не была предназначена для ответа на этот случай.LINQ был задуман как расширяемый язык запросов с механизмом богатых выражений.Linq расширяет синтаксис языка, чтобы разрешить строгие, безопасные для типов выражения для предоставленных типов, и поэтому вы можете использовать его таким образом, чтобы получить строгое и безопасное для типов выражение.

В этом случае вы создаетеФункция, которая преобразует один тип данных (объект T) в другой - общий объект.Если бы мне запретили писать что-то вроде p=>p.Name+"something", я бы потерял многое из присущей языку гибкости.Т.е. это не было бы возможно p=>p.X + p.Y как некоторый результат запроса, который возвращает сумму элементов.

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

Разработчик, который передает p=>p.Name+"something", не уклоняется от предполагаемого использования решения, котороевопрос для обучения.

...