Ayúdenme si los pros y los contras que encontré son razonables o no?
La preocupación que tengo con sus pros y sus contras es que algunos de ellos no abordan las diferencias entre el uso de la reflexión y el uso dinámico. Esa tipificación dinámica hace que los errores no se capten hasta que el tiempo de ejecución sea cierto para cualquier sistema de tipado dinámico. El código de reflexión tiene la misma probabilidad de tener un error que el código que usa el tipo dinámico.
En lugar de pensar en términos de ventajas y desventajas, piense en términos más neutrales. La pregunta que haré es "¿Cuáles son las diferencias entre utilizar Reflection y usar el tipo dinámico?"
Primero: con Reflection obtienes exactamente lo que pediste. Con dynamic, obtienes lo que hubiera hecho el compilador de C# si se le hubiera proporcionado la información de tipo en el tiempo de compilación. Esos son potencialmente dos completamente cosas diferentes. Si tiene un MethodInfo para un método particular e invoca ese método con un argumento particular, entonces que es el método que se invoca, punto. Si usa "dinámico", entonces le está pidiendo al DLR que resuelva en tiempo de ejecución de qué se trata la opinión del compilador de C#, cuál es el método correcto para llamar. El compilador de C# podría elegir un método diferente al que realmente quería.
Segundo: con Reflection puede (si su código se concede niveles de confianza adecuadamente altos) hacer una reflexión privada. Puede invocar métodos privados, leer campos privados, etc. Si hacerlo es una buena idea, no lo sé. Sin duda me parece peligroso y estúpido, pero no sé cuál es tu aplicación. Con dynamic, obtienes el comportamiento que obtendrías del compilador C#; los métodos y campos privados no son visibles.
En tercer lugar: con Reflection, el código que escribe parece un mecanismo . Parece que está cargando un origen de metadatos, extrayendo algunos tipos, extrayendo algunas informaciones de métodos e invocando métodos en objetos del receptor a través de la información del método. Cada paso del camino parece el funcionamiento de un mecanismo . Con dinámica, cada paso del camino se ve como lógica de negocios. Invoca un método en un receptor de la misma forma que lo haría en cualquier otro código. ¿Lo que es importante? En algún código, el mecanismo es realmente lo más importante. En algunos códigos, la lógica comercial que el mecanismo implementa es lo más importante.Elija la técnica que enfatiza el nivel correcto de abstracción.
Cuarto: los costos de rendimiento son diferentes. Con Reflection no obtienes ningún comportamiento en caché, lo que significa que las operaciones son generalmente más lentas, pero no hay costo de memoria para mantener el caché y cada operación cuesta aproximadamente lo mismo. Con el DLR, la primera operación es muy lenta, ya que hace una gran cantidad de análisis, pero el análisis se almacena en caché y se reutiliza. Eso consume memoria, a cambio de una mayor velocidad en llamadas posteriores en algunos escenarios. Cuál es el balance correcto de velocidad y uso de memoria para su aplicación, no lo sé.
¿Necesita hacer una reflexión * privada *? –
No, no necesito una reflexión privada. Cualquier método que necesite llamar es siempre público. – AbrahamJP