2010-04-17 23 views
14

He tenido curiosidad sobre la creación dinámica de clases en tiempo de ejecución en C# y tropecé con este artículo. http://olondono.blogspot.com/2008/02/creating-code-at-runtime.html Tengo curiosidad por escuchar algunos pros y contras con respecto a la construcción de una clase en tiempo de ejecución.Creación de clases de C# en tiempo de ejecución

¿Alguna opinión?

+0

¿Además de esta pregunta? ¿Puedes guardar el código que se creó en el tiempo de ejecución utilizando Reflection para un ensamblaje? De esta manera no tienes que crearlo de nuevo? –

+0

Sí, de hecho, el enlace que proporcionó ya guarda el código generado. –

+0

lol. Gracioso es la última parte de ese código. Muestra cuánto estaba prestando atención. Lo siento por eso. –

Respuesta

19

La metaprogramación tiene todas las ventajas de la generación de código de tiempo de compilación, pero sin el paso de código adicional. Esto es muy común en el código de la biblioteca, como ORM, serializadores, algunos tipos de AOP, contenedores DI/IoC, etc.

  • + evita la necesidad de pasos de generación adicionales o escribir código mundano
  • + dicho código puede manejar lo realidad es el caso en tiempo de ejecución, en lugar de tener que manejar cualquier de borde casos poco comunes o porciones de las envolturas alrededor de envolturas (decorator)
  • + permite codegen en escenarios donde los metadatos sólo se conoce en tiempo de ejecución
  • + IL tiempo de ejecución puede tener más acceso a los campos privados, etc., gracias a la forma en DynamicMethod puede estar asociado con un tipo; el código completamente generado (dll) requeriría [InternalsVisibleTo] o similar, que puede ser imposible
  • - no todos los sistemas admiten runtime code-gen; está deshabilitado en algunas configuraciones de servidor, marco compacto, iPhone, etc.
  • - es error feo que hacer. Independientemente de cómo lo haga, este es no código normal.
  • - tiene una muy buena comprensión de cómo funcionan realmente las cosas bajo las sábanas
  • + si te obliga a conseguir una muy buena comprensión de cómo funcionan realmente las cosas bajo las sábanas

estoy Actualmente se -escribir una biblioteca existente para usar la generación IL de tiempo de ejecución; es muy gratificante y estoy feliz con eso; pero es diferente de cualquier cosa que he escrito antes.

+0

Gracias a todos por sus opiniones. –

0

Probablemente ya tenga experiencia con las clases generadas en tiempo de ejecución. Los genéricos se crean en tiempo de ejecución en el CLR, cuando se necesitan por primera vez. También lo son las implementaciones de XmlSerializer.

Construir clases desde cero en tiempo de ejecución es probable que sea bastante feo (a menos que prefiera una gran reflexión y código Code Dom). Sería una situación rara donde esta era la solución más clara y simple.

0

Ventaja: Puede crear en tiempo de ejecución lo que sea necesario.

Desventaja: no tiene comprobaciones en tiempo de compilación, por lo que si algo sale mal, todo explota.

Básicamente lo mismo que las ventajas/desventajas de usar Reflection.

5

Esto no es una cuestión de pros y contras.

A veces es conveniente crear una clase basada en información que es tediosa para convertir el código de otra manera o en información que no está disponible hasta el tiempo de ejecución.

El ejemplo en el artículo vinculado no es algo que (como programador de aplicaciones) haría normalmente. Pero es útil en herramientas que, por ejemplo, generan clases basadas en una base de datos o esquema XML.

2

Hay un tiempo y un lugar para todo, incluido esto (por ejemplo, genéricos). Sin embargo, consideraría las alternativas a generar clases en tiempo de ejecución antes de seguir adelante y hacerlo. Es probable que haya una alternativa mejor y más fácil de mantener que generar clases.

0

Una de las cosas que me viene a la mente es el uso de la memoria. Si construye dinámicamente una clase para manejar alguna solicitud cada vez que recibe una solicitud, corre el riesgo de generar una nueva clase para los mismos valores cada vez. Una vez que una clase o ensamblaje se carga en un dominio de aplicación, no se puede descargar. Por lo tanto, intente almacenar en caché ensamblados y clases generados siempre que sea posible.

Cuestiones relacionadas