Почему отраженный доступ к защищенному / частному члену classа в C #?

Почему отраженный доступ к защищенному / частному члену classа в C #?

Разве это не безопасно для classа, почему рефлексия дается такой силой? Это анти-шаблон ?

Это необходимо для сценариев, таких как удаленный доступ, сериализация, материализация и т. Д. Вы не должны использовать его вслепую, но обратите внимание, что эти средства всегда были доступны в любой системе (по сути, путем прямого обращения к памяти). Отражение просто формализует его и помещает элементы управления и проверки на пути, которые вы не видите, потому что вы, по-видимому, выполняете «полное доверие», поэтому вы уже сильнее, чем система, которая защищена.

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

Это анти-шаблон?

Только если ваш код использует его ненадлежащим образом. Например, рассмотрим следующее (действительное для WCF-контракта):

[DataMember] private int foo; public int Foo { get {return foo;} set {foo = value;} } 

Неправильно ли для WCF поддерживать это? Я подозреваю, что нет … существует несколько сценариев, в которых вы хотите сериализовать то, что не является частью публичного API, без отдельного DTO. Аналогично, LINQ-to-SQL материализуется в частных членов, если вы так выбираете.

Доступность элемента не является функцией безопасности. Он защищает программиста от самого себя. Это помогает внедрить инкапсуляцию, но это отнюдь не функция безопасности.

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

Потому что он указан в спецификации ECMA, 9 метаданных .

Отражение абсолютно необходимо для отладчика. Представьте, что вы переходите через свою программу и не можете видеть значения ваших личных переменных. Вероятно, это причина, по которой reflection работает в .NET и Java, как это работает, чтобы сделать отладку очень простой.

Если нам не нужны отладчики, я могу представить, что reflection будет ограничено в духе ООП .

  • C # Reflection - Получить значения полей из простого classа
  • Изменение частных конечных полей посредством отражения
  • Использование Case / Switch и GetType для определения объекта
  • Отражение: как получить общий метод?
  • Как проверить, является ли тип анонимным?
  • Использовать reflection для вызова переопределенного базового метода
  • Можно ли задать значение свойства с помощью Reflection?
  • Как вызвать метод расширения с помощью отражения?
  • Как получить имена параметров метода в Java 8 с использованием отражения?
  • Как я могу динамически добавлять поле в class в C #
  • Отражение Java: как я могу получить анонимные внутренние classы?
  • Давайте будем гением компьютера.