Я избегаю использования отражения. Да, это делает вашу программу более гибкой. Но эта гибкость дорого обходится: не требуется проверка имен или типов полей во время компиляции или любой другой информации, которую вы собираете с помощью отражения.
Как и многие вещи, это зависит от того, что вы делаете. Если природа вашей логики такова, что вы НИКОГДА не сравниваете имена полей (или что-то еще), найденные с постоянным значением, тогда использование отражения, вероятно, является хорошей вещью. Но если вы используете отражение для поиска имен полей, а затем просматриваете их в поисках полей с именами «Автор» и «Заголовок», вы только что создали более сложное моделирование объекта с двумя именованными полями. А что, если вы ищете «Автор», когда поле на самом деле называется «AuthorName», или вы намереваетесь найти «Автор» и случайно ввести «Автор»? Теперь у вас есть ошибки, которые не будут отображаться до времени выполнения, а не будут отмечены во время компиляции.
С помощью жестко закодированных имен полей ваша IDE может сообщать вам о каждом месте, где используется определенное поле. С отражением ... не так легко сказать. Может быть, вы можете выполнить текстовый поиск по имени, но если имена полей передаются как переменные, это может быть очень сложно.
Сейчас я работаю над системой, где авторам оригинала нравились рефлексия и подобные методы. Существует множество мест, где им нужно создать экземпляр класса, и вместо того, чтобы просто сказать «новый» и класс, они создают токен, который они ищут в таблице, чтобы получить имя класса. Что это дает? Да, мы могли бы изменить таблицу, чтобы сопоставить этот токен с другим именем. И это приобретает нас ... что? Когда вы в последний раз говорили: «О, каждое место, где моя программа создает экземпляр Customer, я хочу изменить, чтобы создать экземпляр NewKindOfCustomer». Если у вас есть изменения в классе, вы изменяете класс, не создавая новый класс, а оставляя старый для ностальгии.
Чтобы решить аналогичную проблему, я регулярно создаю экраны ввода данных на лету, запрашивая у базы данных список имен полей, типов и размеров, а затем выкладывая их оттуда. Это дает мне преимущество использования одной и той же программы для всех более простых экранов ввода данных - просто передайте имя таблицы в качестве параметра - и, если поле добавлено или удалено, требуется нулевое изменение кода. Но это работает только до тех пор, пока мне все равно, какие поля. Как только у меня появятся валидации или побочные эффекты, характерные для этого экрана, система доставит больше хлопот, чем стоит, и мне лучше вернуться к более явному кодированию.