Ну, этот вопрос довольно старый, и я жду, пока завершится tf get
... поэтому я сам на него отвечу.
Да, LCG в большинстве случаев мертв.
Раньше мы использовали немного LCG, и теперь он все преобразован для использования деревьев выражений.Их гораздо проще создавать, код значительно проще поддерживать и отлаживать, а сообщения об ошибках, как правило, более информативны, чем «Операция может дестабилизировать среду выполнения», когда вы ошибаетесь во время разработки.
Но, пожалуй, самое главное, деревья выражений компонуются так, как это делает Reflection.Emit.Это означает, что архитектура компонентов, используемых для генерации кода во время выполнения, может быть более модульной и даже позволять плагинам расширять инфраструктуру генерации кода.
Одна вещь, которую я обнаружил, поддерживается Reflection.Emit, которая не 'В деревьях выражений напрямую поддерживается установка полей .initonly
.Это, однако, может быть достигнуто с помощью небольшого вспомогательного класса и вызова его в дереве выражений, например, которое я использовал ниже:
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;
}
}
Стоит упомянуть одну обратную сторону использования выражениядеревья, а не LCG заключается в том, что построение и компиляция деревьев выражений определенно медленнее, чем непосредственный вывод необработанных кодов операций.Предполагая, что вы кешируете скомпилированные методы, это вряд ли будет серьезной проблемой, но это единственная причина, которая может заставить вас использовать LCG.