Eh bien, cette question est assez ancienne maintenant, et j'attends un tf get
pour terminer ... alors je vais y répondre moi-même.
Oui, LCG est mort dans la plupart des cas.
Nous avions l'habitude de faire un peu d'utilisation de LCG et il a maintenant été converti pour utiliser des arbres d'expression à la place. Ils sont beaucoup plus faciles à construire, le code est nettement plus facile à maintenir et à déboguer, et les messages d'erreur sont généralement plus informatifs que «l'opération pourrait déstabiliser l'exécution» lorsque vous avez des problèmes lors du développement. Mais, peut-être le plus important, les arbres d'expression sont composables d'une manière que Reflection.Emit ne l'est pas. Cela signifie que l'architecture des composants utilisés pour la génération de code d'exécution peut être plus modulaire et même permettre aux plugins d'étendre la structure de génération de code.
La seule chose que j'ai trouvé qui est pris en charge par Reflection.Emit qui n'est pas directement pris en charge dans les arborescences d'expression est la définition des champs .initonly
. Cependant, cela peut être réalisé en utilisant une petite classe d'aide et de l'invoquer dans l'arbre d'expression, par exemple celui que j'utilisé est ci-dessous:
internal static class FieldHelper
{
public static TTarget AssignInitOnlyField<TTarget, TField>(
TTarget target, string fieldName, TField value)
{
var field = target.GetType().GetField(
fieldName,
BindingFlags.Instance|BindingFlags.Public|BindingFlags.NonPublic);
var boxed = (object)target; // required for value type support
field.SetValue(boxed, value);
return (TTarget)boxed;
}
}
Il convient de mentionner l'un vers le bas-côté en utilisant des arbres d'expression plutôt que LCG est que la construction et la compilation des arbres d'expression est nettement plus lente que d'émettre directement les codes op bruts. En supposant que vous mettez en cache les méthodes compilées, il est peu probable que ce soit un problème important, mais c'est la seule raison qui pourrait vous obliger à utiliser LCG.
La réponse est clairement non. LCG est précisément utile car il permet de compiler IL dans l'exécution, ce qui le rend beaucoup plus performant. Si vous n'avez pas besoin du code construit pour être rapide, vous n'en avez pas besoin. Donc, fondamentalement, LCG a toujours son créneau. – Benja