No es hacer trampa, pero como cualquier herramienta, debe usarse para lo que pretende resolver. La reflexión, por definición, le permite inspeccionar y modificar el código a través del código; Si eso es lo que necesita hacer, entonces la reflexión es la herramienta para el trabajo. La reflexión tiene que ver con el meta-código: código que apunta al código (a diferencia del código regular, que apunta a los datos).
Un ejemplo de buen uso de la reflexión son las clases de interfaz de servicio web genéricas: un diseño típico es separar la implementación del protocolo de la funcionalidad de carga útil. Entonces, tienes una clase (llamémosla T
) que implementa tu carga útil, y otra que implementa el protocolo ( P
). T
es bastante sencillo: para cada llamada que desee realizar, simplemente escriba un método que haga lo que se supone que debe hacer. P
, sin embargo, necesita asignar las llamadas de servicio web a las llamadas de método. Hacer este mapeo genérico es deseable, ya que evita la redundancia y hace que P
sea altamente reutilizable. Reflexión proporciona los medios para inspeccionar la clase T
en tiempo de ejecución y llamar a sus métodos basados en cadenas pasadas a P
a través del protocolo de servicio web, sin ningún conocimiento en tiempo de compilación de la clase T
. Usando la regla de 'código sobre código', se puede argumentar que la clase P
tiene el código en la clase T
como parte de sus datos.
Sin embargo.
Reflection también le brinda herramientas para sortear las restricciones del sistema tipográfico del idioma; teóricamente, puede pasar todos los parámetros como tipo object
y llamar a sus métodos a través de reflexiones. Voilà, el lenguaje que se supone que impone una fuerte disciplina de escritura estática ahora se comporta como un lenguaje tipificado dinámicamente con un enlace tardío, solo que la sintaxis es mucho más elaborada. Cada instancia de tal patrón que he visto hasta ahora ha sido un truco sucio, e invariablemente, una solución dentro del sistema tipográfico del lenguaje hubiera sido posible, y habría sido más segura, más elegante y más eficiente en todos los aspectos. .
Existen algunas excepciones, como los controles GUI que pueden vincularse a varios tipos de fuentes de datos no relacionados; exigir que sus datos implementen una interfaz determinada solo para que pueda enlazarlos, no es realista, y el programador no implementa un adaptador para cada tipo de fuente de datos. En este caso, usar la reflexión para detectar el tipo de origen de datos y ajustar el enlace de datos es una opción más útil.