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 IDumpFormatter GetFormatter(TraverseNode node)
        {
            IDumpFormatter formatter = null;

            if (node.Item != null)
            {
                formatter = Settings.GetFormatter(node.Item.GetType());
            }
            return(formatter);
        }
        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);
                    }
                }
            }
        }
Пример #4
0
 public void AddFormatter(IDumpFormatter formatter)
 {
     _formatters.Add(formatter.FormatterType, formatter);
 }