public virtual void WriteValue (object value)
{
if (value == null)
throw new ArgumentNullException ("value");
if (value is string)
WriteString ((string) value);
else if (value is bool)
WriteValue ((bool) value);
else if (value is byte)
WriteValue ((int) value);
else if (value is byte [])
WriteBase64 ((byte []) value, 0, ((byte []) value).Length);
else if (value is char [])
WriteChars ((char []) value, 0, ((char []) value).Length);
else if (value is DateTime)
WriteValue ((DateTime) value);
else if (value is decimal)
WriteValue ((decimal) value);
else if (value is double)
WriteValue ((double) value);
else if (value is short)
WriteValue ((int) value);
else if (value is int)
WriteValue ((int) value);
else if (value is long)
WriteValue ((long) value);
else if (value is float)
WriteValue ((float) value);
else if (value is TimeSpan) // undocumented
WriteString (XmlConvert.ToString ((TimeSpan) value));
else if (value is XmlQualifiedName) {
XmlQualifiedName qname = (XmlQualifiedName) value;
if (!qname.Equals (XmlQualifiedName.Empty)) {
if (qname.Namespace.Length > 0 && LookupPrefix (qname.Namespace) == null)
throw new InvalidCastException (String.Format ("The QName '{0}' cannot be written. No corresponding prefix is declared", qname));
WriteQualifiedName (qname.Name, qname.Namespace);
}
else
WriteString (String.Empty);
}
else if (value is IEnumerable) {
bool follow = false;
foreach (object obj in (IEnumerable) value) {
if (follow)
WriteString (" ");
else
follow = true;
WriteValue (obj);
}
}
else
throw new InvalidCastException (String.Format ("Type '{0}' cannot be cast to string", value.GetType ()));
}