コード例 #1
0
                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);
                }