Je pense que les points clés concernant CodeDOM et Reflection.Emit sont les suivants :
-
CodeDom génère du code source C# et est généralement utilisé pour générer du code à inclure dans une solution et à compiler dans l'IDE (par exemple, les classes LINQ to SQL, WSDL, XSD fonctionnent toutes de cette manière). Dans ce scénario, vous pouvez également utiliser des classes partielles pour personnaliser le code généré. Cette méthode est moins efficace, car elle génère du code source C# et fait ensuite tourner le compilateur pour l'analyser (encore !) et le compiler. Vous pouvez générer du code en utilisant des constructions de relativement haut niveau (similaires aux expressions et instructions C#) telles que les boucles.
-
Reflection.Emit génère un IL de sorte qu'il produit directement un assemblage qui peut également être stocké uniquement en mémoire. Vous devez générer du code IL de bas niveau (les valeurs sont stockées sur la pile ; les boucles doivent être implémentées en utilisant des sauts), donc générer une logique plus complexe est un peu difficile.
En général, je pense que Reflection.Emit est considéré comme le moyen préféré de générer du code au moment de l'exécution, tandis que CodeDOM est préféré pour générer du code avant la compilation. Dans votre scénario, les deux méthodes fonctionneraient probablement bien (bien que CodeDOM ait besoin de privilèges plus élevés, car il doit invoquer le compilateur C#, qui fait partie de toute installation .NET).
Une autre option serait d'utiliser le Expression
classe . Dans .NET 4.0, il vous permet de générer du code équivalent aux expressions et aux instructions C#. Cependant, il ne vous permet pas de générer des classes. Vous pouvez donc combiner cette fonction avec Reflection.Emit (pour générer des classes qui délèguent la mise en œuvre au code généré à l'aide de la fonction Expression
). Pour certains scénarios, vous n'avez pas vraiment besoin d'une hiérarchie de classes complète - souvent, un dictionnaire de délégués générés dynamiquement, tels que Dictionary<string, Action>
pourrait être suffisant (mais bien sûr, cela dépend de votre scénario exact).