private void Dump(object obj, TextWriter tw, int currentDepth) { // SPECIAL CASE - formatter is available if (obj != null) { IDumpFormatter formatter = Settings.GetFormatter(obj.GetType()); if (formatter != null) { tw.Write(formatter.Format(obj)); return; } } // SPECIAL CASE - primitive types: nulls, strings, numbers, characters... if (obj == null || obj is ValueType || obj is string) { _formatter.WriteValue(obj, tw); } //SPECIAL CASE - Lists, arrays... else if (obj is IEnumerable) { IEnumerable collection = obj as IEnumerable; foreach (object item in collection) { _formatter.NewLine(tw); Dump(item, tw, currentDepth); } } else { ObjectDump(obj, tw, currentDepth); } }
private bool Write(Stack <TraverseNode> nodes, TraverseNode node, TextWriter tw) { bool result = false; bool isNamed = false; if (!string.IsNullOrWhiteSpace(node.Name)) { isNamed = true; _formatter.WriteName(node.GetNames(), node.Level, tw, Settings.WriteElementType); result = true; } object obj = node.Item; if (obj == null || obj is ValueType || obj is string) { _formatter.WriteValue(obj, tw, isNamed); result = true; } else if (obj is IEnumerable) { IList <object> collection = (obj as IEnumerable).Cast <object>().ToList(); List <TraverseNode> children = new List <TraverseNode>(); for (int i = 0; i < collection.Count(); i++) { object item = collection[i]; children.Add(new TraverseNode($"[{i}]", $"{item?.GetType().FullName}[]", item, node, node.Level + 1)); } PrepareChildren(nodes, node, children.Reverse <TraverseNode>()); } return(result); }