private object CastDefaultValue(ArgumentModel arg, object value) { var argType = arg.Type; var valueType = value.GetType(); bool isArgCollection = _collectionCtorProvider.TryGetConstructor(argType, out var argColCtor); bool isValueCollection = _collectionCtorProvider.TryGetConstructor(valueType, out var valueColCtor); if (isArgCollection && isValueCollection) { var argElemType = argColCtor.GetElementType(argType); var valueElemType = valueColCtor.GetElementType(valueType); if (!argElemType.GetTypeInfo().IsAssignableFrom(valueElemType)) { throw new ArgumentParseException(arg, String.Format(CastErrorMessagTemplate, valueElemType.Name, argElemType.Name)); } return(CopyCollection(valueColCtor, value, argColCtor, argType)); } if (argType.GetTypeInfo().IsAssignableFrom(valueType)) { return(value); } throw new ArgumentParseException(arg, String.Format(CastErrorMessagTemplate, valueType.Name, argType.Name)); }
public bool TryGetOperandType(IReadOnlyList <string> commandName, int operandIndex, out Type valueType) { if (commandName == null) { throw new ArgumentNullException(nameof(commandName)); } if (operandIndex < 0) { throw new ArgumentOutOfRangeException(nameof(operandIndex)); } var commands = _appModel.Commands .Where(_ => _nameComparer.StartsWith(_.Name, commandName)) .ToArray(); if (commands.Length != 1) { valueType = null; return(false); } var operands = commands[0].Arguments .Where(_ => _.Kind == ArgumentKind.Operand); int currentIndex = 0; foreach (var operand in operands) { bool isCollection = _collectionCtorProvider.TryGetConstructor(operand.Type, out var colCtor); if (isCollection) { // Array consumes all operands till the end. valueType = colCtor .GetElementType(operand.Type) .UnwrapIfNullable(); return(true); } if (currentIndex == operandIndex) { valueType = operand.Type.UnwrapIfNullable(); return(true); } currentIndex++; } valueType = null; return(false); }
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)); } }