Почему используется отражение in.NET рекомендуется?


Это, безусловно, хорошая практика, чтобы использовать его?

Каковы некоторые возможные ситуации в проекте, которые нуждаются в отражении?

9 53

9 ответов:

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

противники отражения будут ссылаться на то, что он медленный, что верно по сравнению со статическим выполнением кода-однако отражение используется во всей платформе .NET framework, и при условии, что оно не злоупотребляется, оно может быть очень мощным инструментом в набор инструментов.

некоторые полезные приложения:

  • определение зависимостей сборки

  • типы местоположений, соответствующие интерфейсу, производные от базового / абстрактного класса и поиск членов по атрибутам

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

  • отладка - вывалить список загруженных сборок, их ссылки, современные методы и т. д...

есть много применений для размышления:

  1. перебор свойств в объекте.
  2. вызов метода, определенного во время выполнения.
  3. другие в том же духе.

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

например, я написал атрибуты, которые отмечают, какие свойства в моих классах должны быть проиндексированы с помощью Lucene. Во время выполнения, Я могу посмотреть на любой класс и выяснить, какие поля нужно индексировать, просто запросив класс для "отмеченных" свойств.

отражение-это просто способ исследования объектов во время выполнения. Вы не должны использовать его, если вам не нужно делать именно это.

отражение позволяет приложению собирать информацию о себе, а также манипулировать на себя. Он может использоваться для поиска всех типов в сборке и/или динамического вызова методов в сборке.

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

Как уже упоминалось выше, производительность будет хитом.

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

причин использовать это много. Вот это введение если вам нужно.

отражение обычно используется в контейнерах МОК. Допустим, вы хотите зарегистрировать каждый конкретный класс В конце со словом "контроллер". Отражение делает это куском пирога.

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

очень полезный класс XmlSerialization полагается на отражение. Вам не нужно иметь дело с отражением самостоятельно, чтобы использовать сериализацию, классы сериализации вызывают отражение сами. Но это помогает пометить ваш код атрибутами, которые определяют, как объекты сериализуются. Классы сериализации используют отражение во время выполнения для чтения этих атрибутов. В конце концов, процесс кажется почти волшебным, требуя очень мало строк явного кодирования в приложении; это отражение, которое делает такое удобство возможно.

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

исходя из C++ и нуждаясь в некоторых простых иерархиях классов, я могу сказать, что is ключевое слово бесценно!

class MenuItem : Item { }

foreach(Item items in parent.ChildItems) {
    if (item is MenuItem) { /* handle differently */ }
}

С. П. не отражение немного дорого, кстати?