예제 #1
0
        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));
        }
예제 #2
0
        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);
        }
예제 #3
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));
            }
        }