private static TreeNode TraverseWithoutCaching(Type type, Stack <Type> traverseStack)
        {
            if (IsSimpleType(type))
            {
                return(TreeNode.Empty);
            }

            if (ReflectionProvider.TryGetDictionaryValueType(type, out var valueType))
            {
                return(TreeNode.Dictionary(TraverseWithCaching(valueType, traverseStack)));
            }

            if (ReflectionProvider.TryGetEnumerableElementType(type, out var elementType))
            {
                return(TreeNode.Collection(TraverseWithCaching(elementType, traverseStack)));
            }

            var properties = ReflectionProvider.GetProperties(type)
                             .Select(p => new ObjectProperty(p, TraverseWithCaching(p.PropertyType, traverseStack)))
                             .ToArray();

            return(TreeNode.Object(properties));
        }