예제 #1
0
        public MultiValueParseResult Parse(
            Type valueType,
            IReadOnlyList <string> stringValues,
            SingleValuePolicy singleValuePolicy = SingleValuePolicy.UseFirstValue,
            Type valueParserType           = null,
            IFormatProvider formatProvider = null)
        {
            if (valueType == null)
            {
                throw new ArgumentNullException(nameof(valueType));
            }
            if (stringValues == null)
            {
                throw new ArgumentNullException(nameof(stringValues));
            }
            if (stringValues.Count == 0)
            {
                throw new ArgumentOutOfRangeException(nameof(stringValues));
            }

            bool isCollection = _collectionCtorProvider.TryGetConstructor(valueType, out ICollectionConstructor colCtor);

            if (isCollection)
            {
                var elemType = colCtor.GetElementType(valueType);
                valueType = elemType.UnwrapIfNullable();
                var valueParser = _valueParserProvider.GetParser(valueType, valueParserType);

                int      valuesCount = stringValues.Count;
                object[] values      = new object[valuesCount];

                for (int i = 0; i < valuesCount; i++)
                {
                    values[i] = valueParser.Parse(stringValues[i], valueType, formatProvider);
                }

                var collection = colCtor.Construct(elemType, values);
                return(new MultiValueParseResult(collection, valuesCount));
            }
            else
            {
                valueType = valueType.UnwrapIfNullable();
                var valueParser = _valueParserProvider.GetParser(valueType, valueParserType);

                string stringValue = GetSingleValue(stringValues, singleValuePolicy, out var valuesUsed);

                var value = valueParser.Parse(stringValue, valueType, formatProvider);
                return(new MultiValueParseResult(value, valuesUsed));
            }
        }
예제 #2
0
        public KeyValuePairParser(Type keyValueType, IValueParserProvider valueParserProvider)
        {
            if (valueParserProvider == null)
            {
                throw new ArgumentNullException(nameof(valueParserProvider));
            }
            _keyValueType = keyValueType ?? throw new ArgumentNullException(nameof(keyValueType));

            if (!IsParameterizedKeyValuePair(keyValueType))
            {
                throw new ArgumentException(
                          "Value type must be a parameterized KeyValuePair<TKey, TValye> type.",
                          nameof(keyValueType));
            }

            _keyType   = keyValueType.GenericTypeArguments[0];
            _valueType = keyValueType.GenericTypeArguments[1];

            _keyParser   = valueParserProvider.GetParser(_keyType, parserType: null);
            _valueParser = valueParserProvider.GetParser(_valueType, parserType: null);
        }