using System;
using System.ComponentModel;
using System.Globalization;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
namespace Umbraco.Core.Dynamics
{
///
/// A custom type converter for DynamicXml
///
public class DynamicXmlConverter : TypeConverter
{
public override bool CanConvertTo(ITypeDescriptorContext context, Type sourceType)
{
var convertableTypes = new[] {typeof(string), typeof(XElement), typeof(XmlElement), typeof(XmlDocument)};
return convertableTypes.Any(x => TypeHelper.IsTypeAssignableFrom(x, sourceType))
|| base.CanConvertFrom(context, sourceType);
}
public override object ConvertTo(
ITypeDescriptorContext context,
CultureInfo culture,
object value,
Type destinationType)
{
var dxml = value as DynamicXml;
if (dxml == null)
return null;
//string
if (TypeHelper.IsTypeAssignableFrom(destinationType))
{
return value.ToString();
}
//XElement
if (TypeHelper.IsTypeAssignableFrom(destinationType))
{
return dxml.BaseElement;
}
//XmlElement
if (TypeHelper.IsTypeAssignableFrom(destinationType))
{
var xDoc = new XmlDocument();
xDoc.LoadXml(dxml.ToString());
return xDoc.DocumentElement;
}
//XmlDocument
if (TypeHelper.IsTypeAssignableFrom(destinationType))
{
var xDoc = new XmlDocument();
xDoc.LoadXml(dxml.ToString());
return xDoc;
}
return base.ConvertTo(context, culture, value, destinationType);
}
}
}