Причина, з якою люди насторожено використовують рефлексію, - це не ефективність: так, є деяка накладні витрати на використання рефлексії, але часто для вирішення проблеми без неї потрібен інший підхід із порівнянною складністю, і навіть якщо цього не відбувається, накладні витрати є рідко значущий (особливо для розробки додаткового рівня).
Використовуючи роздуми, деякі важливі припущення, які зазвичай можна зробити про вихідний код, порушені, а такі інструменти, як "Знайти всі посилання", перестають надійно працювати. Рефлексія також в основному видаляє більшу частину безпеки типу, яку компілятор виконує, скажімо, на C #, і більшість помилок програмування, які типова система звичайно вловлює та перетворює на помилки компілятора, тепер стають помилками виконання в кращому випадку або дуже неясними помилками в гіршому випадку.
То чому тоді люди використовують рефлексію? Простіше кажучи, адже, незважаючи на описані вище проблеми, це дуже цінний інструмент. Зважаючи на відображення, деякі переваги динамічного програмування можна мати в статичній строго типізованій мові, як C #, а мови динамічного програмування показали свої заслуги останнім часом, особливо у царині веб-програмування - PHP, Javascript та досить помітно Python , всі використовують динамічний набір тексту та добре зарекомендували себе для веб-програмування. Але оскільки мова все ще є C #, ви можете зберегти більшу частину своєї програми у строго набраній ідіомі OOP та написати ту частину, де динамічна поведінка дійсно має значення з відображенням.
Типовий приклад - коли вам потрібно виставити методи як виклики веб-служб (використовуючи протокол, ще не вбудований у .NET). Суворо типовий підхід OOP дійсно працює, але він є надмірно обмежуючим і незграбним. Але якщо ви використовуєте відображення для відображення викликів методів та пар ключів / значень до аргументів, ви можете написати сантехніка для такої веб-служби один раз, а потім використовувати її в будь-якому класі, який вам подобається.