예제 #1
0
        static bool TryConvert(Context ctx, Arg arg, PropertyInfo prop, Type targetType, out object?result)
        {
            var value = arg.Value;

            var converterContext = new ConverterContext
            {
                ParseOptions   = ctx.Options,
                Arg            = arg,
                TargetProperty = prop,
                TargetType     = targetType
            };

            // User provided converters
            foreach (var t in ctx.Options._customConverters)
            {
                if (t.converter.TryConvert(converterContext, arg, out result))
                {
                    return(true);
                }
            }

            // Built in converters
            foreach (var c in BuiltInConverters)
            {
                if (c.TryConvert(converterContext, arg, out result))
                {
                    return(true);
                }
            }

            // Array
            if (targetType.IsArray)
            {
                var elementType = targetType.GetElementType();
                // todo: get seperator from attribute or options
                // todo: maybe add support for quotes (so seperator can be used inside)
                var strValues = value.Split(',');

                var ar = Array.CreateInstance(elementType, strValues.Length);
                for (int i = 0; i < strValues.Length; i++)
                {
                    var elementArg = Arg.CreateForArrayElement(arg, strValues[i]);

                    if (TryConvert(ctx, elementArg, prop, elementType, out object?element))
                    {
                        ar.SetValue(element, i);
                    }
                    else
                    {
                        throw new InvalidCastException($"Error while converting array element to type \"{elementType.FullName}\". Index: [{i}]. SourceValue: \"{strValues[i]}\"");
                    }
                }

                result = ar;
                return(true);
            }

            result = null;
            return(false);
        }