private static ISettingsNode Parse([CanBeNull] object obj, [NotNull] ObjectSourceSettings settings) { if (obj == null) { return(null); } return(ParseObject(null, obj, new HashSet <object>(ByReferenceEqualityComparer <object> .Instance), settings)); }
private static ISettingsNode ParseObject([CanBeNull] string name, [CanBeNull] object item, [NotNull] HashSet <object> path, [NotNull] ObjectSourceSettings settings) { if (item == null) { return(new ValueNode(name, null)); } if (!path.Add(item)) { throw new ArgumentException("Object has cyclic dependency."); } try { var itemType = item.GetType(); if (CustomFormatters.TryFormat(item, out var customFormatting)) { return(new ValueNode(name, customFormatting)); } if (ParseMethodFinder.HasAnyKindOfParseMethod(itemType) && ToStringDetector.TryInvokeCustomToString(itemType, item, out var asString)) { return(new ValueNode(name, asString)); } if (DictionaryInspector.IsSimpleDictionary(itemType)) { return(ParseDictionary(name, DictionaryInspector.EnumerateSimpleDictionary(item), path, settings)); } if (item is IEnumerable sequence) { return(ParseEnumerable(name, sequence, path, settings)); } var fieldsAndProperties = new List <ISettingsNode>(); foreach (var field in itemType.GetInstanceFields()) { var fieldValue = field.GetValue(item); if (fieldValue != null || !settings.IgnoreFieldsWithNullValue) { fieldsAndProperties.Add(ParseObject(field.Name, fieldValue, path, settings)); } } foreach (var property in itemType.GetInstanceProperties()) { var propertyValue = property.GetValue(item); if (propertyValue != null || !settings.IgnoreFieldsWithNullValue) { fieldsAndProperties.Add(ParseObject(property.Name, propertyValue, path, settings)); } } return(new ObjectNode(name, fieldsAndProperties)); } finally { path.Remove(item); } }
public ObjectSource([CanBeNull] ObjectSourceSettings settings = null) : base(obj => Parse(obj, settings ?? new ObjectSourceSettings())) { }
public ObjectSource([CanBeNull] object source, [CanBeNull] ObjectSourceSettings settings = null) : this(settings) { Push(source); }
private static ArrayNode ParseEnumerable(string name, IEnumerable sequence, HashSet <object> path, ObjectSourceSettings settings) { var items = new List <ISettingsNode>(); foreach (var element in sequence) { items.Add(ParseObject(null, element, path, settings)); } return(new ArrayNode(name, items)); }