Bueno, esta pregunta es bastante antigua ahora, y estoy esperando que se complete un tf get
... así que lo responderé yo mismo.
Sí, LCG está muerto en la mayoría de los casos.
Solíamos hacer un poco de uso de LCG y ahora todo se ha convertido para usar árboles de expresión. Son mucho más fáciles de construir, el código es significativamente más fácil de mantener y depurar, y los mensajes de error son generalmente más informativos que "La operación podría desestabilizar el tiempo de ejecución" cuando se producen errores durante el desarrollo.
Pero, quizás lo más importante, los árboles de expresión son compostables de una manera que Reflection.Emit no lo es. Esto significa que la arquitectura de los componentes utilizados para la generación de código de tiempo de ejecución puede ser más modular e incluso permitir que los complementos amplíen el marco de generación de código.
Lo único que he encontrado que es compatible con Reflection.Emit que no se admite directamente en los árboles de expresiones está configurando los campos .initonly
. Sin embargo, esto se puede lograr mediante el uso de una pequeña clase de ayuda y lo alega, en el árbol de expresión, por ejemplo, el que usé es el siguiente:
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;
}
}
Vale la pena mencionar el lado negativo de la utilización de árboles de expresión en vez que LCG es que la construcción y compilación de los árboles de expresión es definitivamente más lenta que la emisión directa de los códigos de operación. Suponiendo que está almacenando en caché los métodos compilados, es poco probable que sea un problema importante, pero es la única razón por la que todavía podría obligarlo a usar LCG.
La respuesta es clara, no. LCG es precisamente útil porque permite compilar IL en tiempo de ejecución, lo que lo hace mucho más eficiente. Si no necesita que el código creado sea rápido, no lo necesita. Así que, básicamente, LCG todavía tiene su nicho. – Benja