Ejemplo n.º 1
0
 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));
 }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
 public ObjectSource([CanBeNull] ObjectSourceSettings settings = null)
     : base(obj => Parse(obj, settings ?? new ObjectSourceSettings()))
 {
 }
Ejemplo n.º 4
0
 public ObjectSource([CanBeNull] object source, [CanBeNull] ObjectSourceSettings settings = null)
     : this(settings)
 {
     Push(source);
 }
Ejemplo n.º 5
0
        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));
        }