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