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)); } }
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); }