void WriteObject(XElement elem, string name, Type type, object value, bool useNS = false)
{
if (type == typeof(object) && value.GetType().IsSimpleType())
{
var typeOfValue = value.GetType();
var ns = (XNamespace) typeOfValue.Name;
var prefix = typeOfValue.Name.ToLower();
if (!elem.Attributes().Any(a => a.IsNamespaceDeclaration && a.Name.LocalName == prefix))
{
elem.Add(new XAttribute(XNamespace.Xmlns + prefix, ns.NamespaceName));
}
elem.Add(new XElement(ns + name, value));
return;
}
if (useNS)
{
var baseTypes = GetBaseTypes();
WriteElementNamespaces(elem, baseTypes);
}
else
{
var xe = new XElement(name);
elem.Add(xe);
elem = xe;
}
Write(elem, type, value);
}