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