La razón por la que las personas desconfían de usar la reflexión innecesariamente no es el rendimiento: sí, hay algo de sobrecarga para usar la reflexión, pero a menudo, resolver el problema sin ella requiere un enfoque diferente con una complejidad comparable, e incluso si no lo hace, la sobrecarga es rara vez es significativo (especialmente para el desarrollo a nivel de aplicación).
Usando la reflexión, se rompen algunas suposiciones importantes que normalmente se pueden hacer sobre el código fuente, y las herramientas como "Buscar todas las referencias" dejan de funcionar de manera confiable. La reflexión también elimina básicamente la mayor parte de la seguridad de tipo que el compilador impone, por ejemplo, C #, y la mayoría de los errores de programación que un sistema de tipo normalmente detectaría y traduciría en errores del compilador, ahora se convierten en errores de tiempo de ejecución en el mejor de los casos o errores muy oscuros en el peor.
Entonces, ¿por qué la gente usa la reflexión entonces? En pocas palabras, porque a pesar de los problemas descritos anteriormente, es una herramienta muy valiosa. Con la reflexión, algunos de los beneficios de la programación dinámica se pueden obtener en un lenguaje estático, estrictamente tipado como C #, y los lenguajes de programación dinámica han demostrado sus ventajas recientemente, especialmente en el ámbito de la programación web: PHP, Javascript y Python bastante prominente. , todos usan tipeo dinámico y han demostrado ser adecuados para la programación web. Pero dado que el lenguaje sigue siendo C #, puede optar por mantener la mayor parte de su aplicación en un lenguaje estrictamente escrito de OOP, y escribir la pequeña parte donde el comportamiento dinámico realmente marca la diferencia con la reflexión.
Un ejemplo típico es cuando necesita exponer métodos como llamadas de servicio web (usando un protocolo aún no integrado en .NET). El enfoque OOP estrictamente tipificado funciona, pero es demasiado restrictivo y torpe. Pero si usa la reflexión para asignar llamadas a métodos y pares clave / valor a argumentos, puede escribir la plomería para dicho servicio web una vez y luego usarla en cualquier clase que desee.