/// <inheritdoc/> public override void VisitObject(object obj, ObjectDescriptor descriptor, bool visitMembers) { ITypeDescriptor currentDescriptor = descriptor; bool isRootNode = contextStack.Count == 0; if (isRootNode) { bool shouldProcessReference; if (!NotifyNodeConstructing(descriptor, out shouldProcessReference)) { return; } // If we are in the case of a collection of collections, we might have a root node that is actually an enumerable reference // This would be the case for each collection within the base collection. IContent content = descriptor.Type.IsStruct() ? ContentFactory.CreateBoxedContent(this, obj, descriptor, IsPrimitiveType(descriptor.Type)) : ContentFactory.CreateObjectContent(this, obj, descriptor, IsPrimitiveType(descriptor.Type), shouldProcessReference); currentDescriptor = content.Descriptor; rootNode = (GraphNode)NodeFactory(currentDescriptor.Type.Name, content, rootGuid); if (content.IsReference && currentDescriptor.Type.IsStruct()) { throw new QuantumConsistencyException("A collection type", "A structure type", rootNode); } if (content.IsReference) { referenceContents.Add(content); } AvailableCommands.Where(x => x.CanAttach(currentDescriptor, null)).ForEach(rootNode.AddCommand); NotifyNodeConstructed(content); if (obj == null) { rootNode.Seal(); return; } PushContextNode(rootNode); } if (!IsPrimitiveType(currentDescriptor.Type)) { base.VisitObject(obj, descriptor, true); } if (isRootNode) { PopContextNode(); rootNode.Seal(); } }
/// <inheritdoc/> public override void VisitObject(object obj, ObjectDescriptor descriptor, bool visitMembers) { ITypeDescriptor currentDescriptor = descriptor; bool isRootNode = contextStack.Count == 0; if (isRootNode) { // If we're visiting a value type as "object" we need to use a special "boxed" node. var content = descriptor.Type.IsValueType ? ContentFactory.CreateBoxedContent(this, rootGuid, obj, descriptor, IsPrimitiveType(descriptor.Type)) : ContentFactory.CreateObjectContent(this, rootGuid, obj, descriptor, IsPrimitiveType(descriptor.Type)); currentDescriptor = content.Descriptor; rootNode = (IInitializingObjectNode)content; if (content.IsReference && currentDescriptor.Type.IsStruct()) { throw new QuantumConsistencyException("A collection type", "A structure type", rootNode); } if (content.IsReference) { referenceContents.Add(content); } AvailableCommands.Where(x => x.CanAttach(currentDescriptor, null)).ForEach(rootNode.AddCommand); if (obj == null) { rootNode.Seal(); return; } PushContextNode(rootNode); } if (!IsPrimitiveType(currentDescriptor.Type)) { base.VisitObject(obj, descriptor, true); } if (isRootNode) { PopContextNode(); rootNode.Seal(); } }