private static TomlObject CreateArrayType(ITomlRoot root, IEnumerable e) { var et = e.GetElementType(); if (et != null) { var conv = root.Settings.TryGetToTomlConverter(et); if (conv != null) { if (conv.CanConvertTo(typeof(TomlValue))) { var values = e.Select((o) => (TomlValue)conv.Convert(root, o, Types.TomlValueType)); return(new TomlArray(root, values.ToArray())); } else if (conv.CanConvertTo(typeof(TomlTable))) { return(new TomlTableArray(root, e.Select((o) => (TomlTable)conv.Convert(root, o, Types.TomlTableType)))); } else { throw new NotSupportedException( $"Cannot create array type from enumerable with element type {et.FullName}"); } } else { return(new TomlTableArray(root, e.Select((o) => TomlTable.CreateFromClass(root, o, root.Settings.GetTableType(et))))); } } return(new TomlArray(root)); }
public static TomlTable CreateAttachedTableFromClass <T>( this TomlObject rootSource, T obj, TomlTable.TableTypes type = TomlTable.TableTypes.Default) where T : class { if (obj is TomlObject) { throw new InvalidOperationException( $"Can't create TOML table from object of type '{obj.GetType().FullName}'. " + "A TOML table can only be created from non TOML objects."); } var t = TomlTable.CreateFromClass(rootSource.Root, obj, type); return(t); }
internal static TomlObject CreateFrom(ITomlRoot root, object val, PropertyInfo pi) { var t = val.GetType(); var converter = root.Settings.TryGetToTomlConverter(t); if (converter != null) { return((TomlObject)converter.Convert(root, val, Types.TomlObjectType)); } else if (val as IDictionary != null) { return(TomlTable.CreateFromDictionary(root, (IDictionary)val, root.Settings.GetTableType(t))); } else if (t != Types.StringType && (val as IEnumerable) != null) { return(CreateArrayType(root, (IEnumerable)val)); } else { var tableType = root.Settings.GetTableType(t); return(TomlTable.CreateFromClass(root, val, tableType)); } }