in src/log4net/ObjectRenderer/DefaultRenderer.cs [148:212]
public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
{
if (rendererMap == null)
{
throw new ArgumentNullException("rendererMap");
}
if (obj == null)
{
writer.Write(SystemInfo.NullText);
return;
}
Array objArray = obj as Array;
if (objArray != null)
{
RenderArray(rendererMap, objArray, writer);
return;
}
// Test if we are dealing with some form of collection object
IEnumerable objEnumerable = obj as IEnumerable;
if (objEnumerable != null)
{
// Get a collection interface if we can as its .Count property may be more
// performant than getting the IEnumerator object and trying to advance it.
ICollection objCollection = obj as ICollection;
if (objCollection != null && objCollection.Count == 0)
{
writer.Write("{}");
return;
}
// This is a special check to allow us to get the enumerator from the IDictionary
// interface as this guarantees us DictionaryEntry objects. Note that in .NET 2.0
// the generic IDictionary<> interface enumerates KeyValuePair objects rather than
// DictionaryEntry ones. However the implementation of the plain IDictionary
// interface on the generic Dictionary<> still returns DictionaryEntry objects.
IDictionary objDictionary = obj as IDictionary;
if (objDictionary != null)
{
RenderEnumerator(rendererMap, objDictionary.GetEnumerator(), writer);
return;
}
RenderEnumerator(rendererMap, objEnumerable.GetEnumerator(), writer);
return;
}
IEnumerator objEnumerator = obj as IEnumerator;
if (objEnumerator != null)
{
RenderEnumerator(rendererMap, objEnumerator, writer);
return;
}
if (obj is DictionaryEntry)
{
RenderDictionaryEntry(rendererMap, (DictionaryEntry)obj, writer);
return;
}
string str = obj.ToString();
writer.Write( (str==null) ? SystemInfo.NullText : str );
}