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

Вот то, как я решил его, на основе ответов здесь:

Connection conn = ConnectToDB(); //ConnectToDB establishes a connection to the database.
String sql = "INSERT INTO \"TableName\"" +
        "(\"Column1\", \"Column2\",\"Column3\",\"Column4\")" +
        "VALUES ('value1',value2, 'value3', 'value4') RETURNING 
         \"TableName\".\"TableId\"";
PreparedStatement prpState = conn.prepareStatement(sql);
ResultSet rs = prpState.executeQuery();
if(rs.next()){
      System.out.println(rs.getInt(1));
        }
56
задан vaxquis 15 February 2015 в 22:32
поделиться

7 ответов

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

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

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

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

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

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

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

36
ответ дан 26 November 2019 в 17:14
поделиться

Есть много применений для отражения:

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

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

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

31
ответ дан 26 November 2019 в 17:14
поделиться

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

24
ответ дан 26 November 2019 в 17:14
поделиться

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

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

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

6
ответ дан 26 November 2019 в 17:14
поделиться

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

8
ответ дан 26 November 2019 в 17:14
поделиться

Отражение обычно используется в контейнерах IoC. Допустим, вы хотите зарегистрировать каждый конкретный класс, заканчивающийся словом «Контроллер». Отражение делает это проще простого.

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

6
ответ дан 26 November 2019 в 17:14
поделиться

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

class MenuItem : Item { }

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

PS Разве отражение не слишком дорогое, кстати?

0
ответ дан 26 November 2019 в 17:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: