Esempio n. 1
0
        public override Expression Scalar(Expression valueType, BondDataType expectedType, ValueHandler handler)
        {
            var stringValue = Expression.Variable(typeof(string), "valueAsString");

            // Reading primitive field of a struct, or a primitive list item - value is in Xml element text.
            // If we have an empty element, parse it as if it has an empty text.
            // Otherwise: read once to get to the text, handle the text, read once more to get to the end element.
            return(Expression.Block(
                       new[] { stringValue },
                       Expression.IfThenElse(
                           Reader.IsEmptyElement,
                           Expression.Assign(stringValue, StringExpression.Empty()),
                           Expression.Block(
                               Reader.Read(),
                               Expression.IfThenElse(
                                   Expression.Equal(Reader.NodeType, Expression.Constant(XmlNodeType.EndElement)),
                                   Expression.Assign(stringValue, Expression.Constant(string.Empty)),
                                   Expression.Block(
                                       IfNotNodeType(XmlNodeType.Text, IfNotNodeType(XmlNodeType.Whitespace, ParsingError())),
                                       Expression.Assign(stringValue, Reader.Value),
                                       Reader.Read(),
                                       IfNotNodeType(XmlNodeType.EndElement, ParsingError()))))),
                       handler(StringExpression.Convert(stringValue, expectedType))));
        }