protected override Expression VisitConstant(ConstantExpression node) { switch (node.Value) { case null: case string _: return(node); default: if (node.Type.GetTypeInfo().IsValueType) { return(node); } break; } UnaryExpression unaryExpression; if (_templateClosure.TryGetKeyByValue(node.Value, out var existingKey)) { unaryExpression = Expression.Convert( Expression.ArrayIndex(_templateClosureArg, Expression.Constant(existingKey)), node.Type); return(unaryExpression); } var key = _templateClosure.CurrentIndex; _templateClosure[key] = node.Value; var accessor = Expression.ArrayIndex(_templateClosureArg, Expression.Constant(key)); unaryExpression = Expression.Convert(accessor, node.Type); return(unaryExpression); }