public void Dump(object obj, TextWriter tw) { Stack <TraverseNode> nodes = new Stack <TraverseNode>(); nodes.Push(new TraverseNode(string.Empty, string.Empty, obj, null, 0)); while (nodes.Count > 0) { TraverseNode node = nodes.Pop(); if (node.Level >= Settings.MaxDepth) { _formatter.WriteName(node.GetNames(), node.Level, tw, Settings.WriteElementType); _formatter.WriteText(string.Format("{0}{1}{2}{3}", "{", node.ItemType, "}", Environment.NewLine), 0, tw); } else { IDumpFormatter formatter = GetFormatter(node); bool processed = true; if (formatter != null) { _formatter.WriteName(node.GetNames(), node.Level, tw, Settings.WriteElementType); tw.Write(formatter.Format(node.Item)); } else { PrepareChildren(nodes, node, node.GetChildren(Settings)); processed = ProcessNode(nodes, node, tw); } if (processed && nodes.Count > 0) { _formatter.NewLine(tw); } } } }
private void ObjectDump(object obj, TextWriter tw, int currentDepth) { Type type = obj.GetType(); if (type.FullName.Equals($"System.{type.Name}", StringComparison.Ordinal)) { return; } if (type.FullName.Equals($"System.Reflection.{type.Name}", StringComparison.Ordinal)) { return; } int textTabs = currentDepth + 1; _formatter.NewLine(tw); _formatter.WriteText("{", currentDepth, tw); _formatter.NewLine(tw); if (obj == null || obj is ValueType || obj is string) { _formatter.WriteValue(obj, tw); } else { MemberInfo[] members = type.GetMembers(Settings.BindingFlags); for (int i = 0; i < members.Length; i++) { MemberInfo member = members[i]; if (IgnoreCompilerGeneratedMember(member)) { continue; } ClassMember cm = new ClassMember(member); if (cm.IsValid()) { object value = cm.GetValue(obj); if (cm.IsValueType() || cm.IsString()) { _formatter.WriteName(cm.GetNames(), textTabs, tw, Settings.WriteElementType); _formatter.WriteValue(value, tw); } else if (cm.IsEnumerable()) { _formatter.WriteName(cm.GetNames(), textTabs, tw, Settings.WriteElementType); if (!InspectDeepness(cm, tw, currentDepth)) { IEnumerable enumerable = value as IEnumerable; if (enumerable == null) { _formatter.WriteValue(enumerable, tw); } else { foreach (object item in enumerable) { Dump(item, tw, currentDepth + 1); } } } } else { _formatter.WriteName(cm.GetNames(), textTabs, tw, Settings.WriteElementType); if (value == null) { _formatter.WriteValue(value, tw); } else { if (!InspectDeepness(cm, tw, currentDepth)) { Dump(value, tw, currentDepth + 1); } } } if (i + 1 < members.Length) { _formatter.NewLine(tw); } } } } _formatter.NewLine(tw); _formatter.WriteText("}", currentDepth, tw); }