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.
¿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? –
Sí, de hecho, el enlace que proporcionó ya guarda el código generado. –
lol. Gracioso es la última parte de ese código. Muestra cuánto estaba prestando atención. Lo siento por eso. –