// // XmlValueConverter.cs // // Author: // Atsushi Enomoto // // (C)2004 Novell Inc, // // // Permission is hereby granted, free of charge, to any person obtaining // a copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to // permit persons to whom the Software is furnished to do so, subject to // the following conditions: // // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // #if NET_2_0 using System; namespace System.Xml.Schema { public abstract class XmlValueConverter { [MonoTODO] protected XmlValueConverter () { } public abstract object ChangeType (bool value, Type type); public abstract object ChangeType (DateTime value, Type type); public abstract object ChangeType (decimal value, Type type); public abstract object ChangeType (double value, Type type); public abstract object ChangeType (int value, Type type); public abstract object ChangeType (long value, Type type); public abstract object ChangeType (object value, Type type); public abstract object ChangeType (float value, Type type); public abstract object ChangeType (string value, Type type); public abstract object ChangeType (object value, Type type, IXmlNamespaceResolver nsResolver); public abstract object ChangeType (string value, Type type, IXmlNamespaceResolver nsResolver); public abstract bool ToBoolean (bool value); public abstract bool ToBoolean (DateTime value); public abstract bool ToBoolean (decimal value); public abstract bool ToBoolean (double value); public abstract bool ToBoolean (int value); public abstract bool ToBoolean (long value); public abstract bool ToBoolean (object value); public abstract bool ToBoolean (float value); public abstract bool ToBoolean (string value); public abstract DateTime ToDateTime (bool value); public abstract DateTime ToDateTime (DateTime value); public abstract DateTime ToDateTime (decimal value); public abstract DateTime ToDateTime (double value); public abstract DateTime ToDateTime (int value); public abstract DateTime ToDateTime (long value); public abstract DateTime ToDateTime (object value); public abstract DateTime ToDateTime (float value); public abstract DateTime ToDateTime (string value); public abstract decimal ToDecimal (bool value); public abstract decimal ToDecimal (DateTime value); public abstract decimal ToDecimal (decimal value); public abstract decimal ToDecimal (double value); public abstract decimal ToDecimal (int value); public abstract decimal ToDecimal (long value); public abstract decimal ToDecimal (object value); public abstract decimal ToDecimal (float value); public abstract decimal ToDecimal (string value); public abstract double ToDouble (bool value); public abstract double ToDouble (DateTime value); public abstract double ToDouble (decimal value); public abstract double ToDouble (double value); public abstract double ToDouble (int value); public abstract double ToDouble (long value); public abstract double ToDouble (object value); public abstract double ToDouble (float value); public abstract double ToDouble (string value); public abstract int ToInt32 (bool value); public abstract int ToInt32 (DateTime value); public abstract int ToInt32 (decimal value); public abstract int ToInt32 (double value); public abstract int ToInt32 (int value); public abstract int ToInt32 (long value); public abstract int ToInt32 (object value); public abstract int ToInt32 (float value); public abstract int ToInt32 (string value); public abstract long ToInt64 (bool value); public abstract long ToInt64 (DateTime value); public abstract long ToInt64 (decimal value); public abstract long ToInt64 (double value); public abstract long ToInt64 (int value); public abstract long ToInt64 (long value); public abstract long ToInt64 (object value); public abstract long ToInt64 (float value); public abstract long ToInt64 (string value); public abstract float ToSingle (bool value); public abstract float ToSingle (DateTime value); public abstract float ToSingle (decimal value); public abstract float ToSingle (double value); public abstract float ToSingle (int value); public abstract float ToSingle (long value); public abstract float ToSingle (object value); public abstract float ToSingle (float value); public abstract float ToSingle (string value); public abstract string ToString (bool value); public abstract string ToString (DateTime value); public abstract string ToString (decimal value); public abstract string ToString (double value); public abstract string ToString (int value); public abstract string ToString (long value); public abstract string ToString (object value); public abstract string ToString (object value, IXmlNamespaceResolver nsResolver); public abstract string ToString (float value); public abstract string ToString (string value); public abstract string ToString (string value, IXmlNamespaceResolver nsResolver); } internal class XsdNonPermissiveConverter : XmlValueConverter { readonly XmlTypeCode typeCode; public XsdNonPermissiveConverter (XmlTypeCode typeCode) { this.typeCode = typeCode; } public XmlTypeCode Code { get { return typeCode; } } public override object ChangeType (bool value, Type type) { return ChangeType ((object) value, type); } public override object ChangeType (DateTime value, Type type) { return ChangeType ((object) value, type); } public override object ChangeType (decimal value, Type type) { return ChangeType ((object) value, type); } public override object ChangeType (double value, Type type) { return ChangeType ((object) value, type); } public override object ChangeType (int value, Type type) { return ChangeType ((object) value, type); } public override object ChangeType (long value, Type type) { return ChangeType ((object) value, type); } public override object ChangeType (float value, Type type) { return ChangeType ((object) value, type); } public override object ChangeType (string value, Type type) { return ChangeType ((object) value, type); } public override object ChangeType (object value, Type type) { return ChangeType (value, type, null); } [MonoTODO] public override object ChangeType (object value, Type type, IXmlNamespaceResolver nsResolver) { if (value == null) throw new ArgumentNullException ("value"); if (type == null) throw new ArgumentNullException ("type"); switch (Type.GetTypeCode (value.GetType ())) { case TypeCode.Boolean: bool bvalue = (bool) value; switch (Type.GetTypeCode (type)) { case TypeCode.Boolean: return ToBoolean (bvalue); case TypeCode.DateTime: return ToDateTime (bvalue); case TypeCode.Decimal: return ToDecimal (bvalue); case TypeCode.Double: return ToDouble (bvalue); case TypeCode.Int32: return ToInt32 (bvalue); case TypeCode.Int64: return ToInt64 (bvalue); case TypeCode.Single: return ToSingle (bvalue); case TypeCode.String: return ToString (bvalue); } break; // case TypeCode.Byte: // case TypeCode.Char: case TypeCode.DateTime: DateTime dtvalue = (DateTime) value; switch (Type.GetTypeCode (type)) { case TypeCode.Boolean: return ToBoolean (dtvalue); case TypeCode.DateTime: return ToDateTime (dtvalue); case TypeCode.Decimal: return ToDecimal (dtvalue); case TypeCode.Double: return ToDouble (dtvalue); case TypeCode.Int32: return ToInt32 (dtvalue); case TypeCode.Int64: return ToInt64 (dtvalue); case TypeCode.Single: return ToSingle (dtvalue); case TypeCode.String: return ToString (dtvalue); } break; // case TypeCode.DBNull: case TypeCode.Decimal: decimal decvalue = (decimal) value; switch (Type.GetTypeCode (type)) { case TypeCode.Boolean: return ToBoolean (decvalue); case TypeCode.DateTime: return ToDateTime (decvalue); case TypeCode.Decimal: return ToDecimal (decvalue); case TypeCode.Double: return ToDouble (decvalue); case TypeCode.Int32: return ToInt32 (decvalue); case TypeCode.Int64: return ToInt64 (decvalue); case TypeCode.Single: return ToSingle (decvalue); case TypeCode.String: return ToString (decvalue); } break; case TypeCode.Double: double dblvalue = (double) value; switch (Type.GetTypeCode (type)) { case TypeCode.Boolean: return ToBoolean (dblvalue); case TypeCode.DateTime: return ToDateTime (dblvalue); case TypeCode.Decimal: return ToDecimal (dblvalue); case TypeCode.Double: return ToDouble (dblvalue); case TypeCode.Int32: return ToInt32 (dblvalue); case TypeCode.Int64: return ToInt64 (dblvalue); case TypeCode.Single: return ToSingle (dblvalue); case TypeCode.String: return ToString (dblvalue); } break; // case TypeCode.Empty: // case TypeCode.Int16: case TypeCode.Int32: int ivalue = (int) value; switch (Type.GetTypeCode (type)) { case TypeCode.Boolean: return ToBoolean (ivalue); case TypeCode.DateTime: return ToDateTime (ivalue); case TypeCode.Decimal: return ToDecimal (ivalue); case TypeCode.Double: return ToDouble (ivalue); case TypeCode.Int32: return ToInt32 (ivalue); case TypeCode.Int64: return ToInt64 (ivalue); case TypeCode.Single: return ToSingle (ivalue); case TypeCode.String: return ToString (ivalue); } break; case TypeCode.Int64: long lvalue = (long) value; switch (Type.GetTypeCode (type)) { case TypeCode.Boolean: return ToBoolean (lvalue); case TypeCode.DateTime: return ToDateTime (lvalue); case TypeCode.Decimal: return ToDecimal (lvalue); case TypeCode.Double: return ToDouble (lvalue); case TypeCode.Int32: return ToInt32 (lvalue); case TypeCode.Int64: return ToInt64 (lvalue); case TypeCode.Single: return ToSingle (lvalue); case TypeCode.String: return ToString (lvalue); } break; // case TypeCode.Object: // case TypeCode.SByte: case TypeCode.Single: float fvalue = (float) value; switch (Type.GetTypeCode (type)) { case TypeCode.Boolean: return ToBoolean (fvalue); case TypeCode.DateTime: return ToDateTime (fvalue); case TypeCode.Decimal: return ToDecimal (fvalue); case TypeCode.Double: return ToDouble (fvalue); case TypeCode.Int32: return ToInt32 (fvalue); case TypeCode.Int64: return ToInt64 (fvalue); case TypeCode.Single: return ToSingle (fvalue); case TypeCode.String: return ToString (fvalue); } break; case TypeCode.String: string svalue = (string) value; switch (Type.GetTypeCode (type)) { case TypeCode.Boolean: return ToBoolean (svalue); case TypeCode.DateTime: return ToDateTime (svalue); case TypeCode.Decimal: return ToDecimal (svalue); case TypeCode.Double: return ToDouble (svalue); case TypeCode.Int32: return ToInt32 (svalue); case TypeCode.Int64: return ToInt64 (svalue); case TypeCode.Single: return ToSingle (svalue); case TypeCode.String: return ToString (svalue); } break; // case TypeCode.UInt16: // case TypeCode.UInt32: // case TypeCode.UInt64: default: if (type == typeof (TimeSpan)) // xs:duration, xdt:yearMonthDuration, // xdt:dayTimeDuration. FIXME: yMD to // dTD and dTD to yMD are not allowed. return ToTimeSpan (value); if (value.GetType () == typeof (byte [])) { // xs:base64 by default if (type == typeof (string)) return XQueryConvert.Base64BinaryToString ((byte []) value); else if (type == typeof (byte [])) return value; } if (value.GetType () == type) { if (type == typeof (XmlQualifiedName)) { // xs:QName and xs:NOTATION throw new NotImplementedException (); } } break; } throw Error (value.GetType (), type); } public override object ChangeType (string value, Type type, IXmlNamespaceResolver nsResolver) { return ChangeType ((object) value, type, nsResolver); } public TimeSpan ToTimeSpan (bool value) { throw Error (typeof (bool), typeof (TimeSpan)); } public TimeSpan ToTimeSpan (DateTime value) { throw Error (typeof (bool), typeof (TimeSpan)); } public TimeSpan ToTimeSpan (decimal value) { throw Error (typeof (bool), typeof (TimeSpan)); } public TimeSpan ToTimeSpan (double value) { throw Error (typeof (bool), typeof (TimeSpan)); } public TimeSpan ToTimeSpan (int value) { throw Error (typeof (bool), typeof (TimeSpan)); } public TimeSpan ToTimeSpan (long value) { throw Error (typeof (bool), typeof (TimeSpan)); } public virtual TimeSpan ToTimeSpan (object value) { // Allow on overriden converter for xs:duration, // xdt:dayTimeDuration and xdt:yearMonthDuration. throw Error (typeof (bool), typeof (TimeSpan)); } public TimeSpan ToTimeSpan (float value) { throw Error (typeof (bool), typeof (TimeSpan)); } public TimeSpan ToTimeSpan (string value) { throw Error (typeof (bool), typeof (TimeSpan)); } protected InvalidCastException Error (Type valueType, Type destType) { return new InvalidCastException (String.Format ("The conversion from {0} value to {1} type via {2} type is not allowed.", valueType, destType, typeCode)); } public override bool ToBoolean (bool value) { throw Error (typeof (bool), typeof (bool)); } public override bool ToBoolean (DateTime value) { throw Error (typeof (DateTime), typeof (bool)); } public override bool ToBoolean (decimal value) { throw Error (typeof (decimal), typeof (bool)); } public override bool ToBoolean (double value) { throw Error (typeof (double), typeof (bool)); } public override bool ToBoolean (int value) { throw Error (typeof (int), typeof (bool)); } public override bool ToBoolean (long value) { throw Error (typeof (long), typeof (bool)); } public override bool ToBoolean (object value) { if (value == null) throw new ArgumentNullException ("value"); throw Error (value.GetType (), typeof (bool)); } public override bool ToBoolean (float value) { throw Error (typeof (float), typeof (bool)); } public override bool ToBoolean (string value) { throw Error (typeof (string), typeof (bool)); } public override DateTime ToDateTime (bool value) { throw Error (typeof (bool), typeof (DateTime)); } public override DateTime ToDateTime (DateTime value) { throw Error (typeof (DateTime), typeof (DateTime)); } public override DateTime ToDateTime (decimal value) { throw Error (typeof (decimal), typeof (DateTime)); } public override DateTime ToDateTime (double value) { throw Error (typeof (double), typeof (DateTime)); } public override DateTime ToDateTime (int value) { throw Error (typeof (int), typeof (DateTime)); } public override DateTime ToDateTime (long value) { throw Error (typeof (long), typeof (DateTime)); } public override DateTime ToDateTime (object value) { if (value == null) throw new ArgumentNullException ("value"); throw Error (value.GetType (), typeof (DateTime)); } public override DateTime ToDateTime (float value) { throw Error (typeof (float), typeof (DateTime)); } public override DateTime ToDateTime (string value) { throw Error (typeof (string), typeof (DateTime)); } public override decimal ToDecimal (bool value) { throw Error (typeof (bool), typeof (decimal)); } public override decimal ToDecimal (DateTime value) { throw Error (typeof (DateTime), typeof (decimal)); } public override decimal ToDecimal (decimal value) { throw Error (typeof (decimal), typeof (decimal)); } public override decimal ToDecimal (double value) { throw Error (typeof (double), typeof (decimal)); } public override decimal ToDecimal (int value) { throw Error (typeof (int), typeof (decimal)); } public override decimal ToDecimal (long value) { throw Error (typeof (long), typeof (decimal)); } public override decimal ToDecimal (object value) { if (value == null) throw new ArgumentNullException ("value"); throw Error (value.GetType (), typeof (decimal)); } public override decimal ToDecimal (float value) { throw Error (typeof (float), typeof (decimal)); } public override decimal ToDecimal (string value) { throw Error (typeof (string), typeof (decimal)); } public override double ToDouble (bool value) { throw Error (typeof (bool), typeof (double)); } public override double ToDouble (DateTime value) { throw Error (typeof (DateTime), typeof (double)); } public override double ToDouble (decimal value) { throw Error (typeof (decimal), typeof (double)); } public override double ToDouble (double value) { throw Error (typeof (double), typeof (double)); } public override double ToDouble (int value) { throw Error (typeof (int), typeof (double)); } public override double ToDouble (long value) { throw Error (typeof (long), typeof (double)); } public override double ToDouble (object value) { if (value == null) throw new ArgumentNullException ("value"); throw Error (value.GetType (), typeof (double)); } public override double ToDouble (float value) { throw Error (typeof (float), typeof (double)); } public override double ToDouble (string value) { throw Error (typeof (string), typeof (double)); } public override float ToSingle (bool value) { throw Error (typeof (bool), typeof (float)); } public override float ToSingle (DateTime value) { throw Error (typeof (DateTime), typeof (float)); } public override float ToSingle (decimal value) { throw Error (typeof (decimal), typeof (float)); } public override float ToSingle (double value) { throw Error (typeof (double), typeof (float)); } public override float ToSingle (int value) { throw Error (typeof (int), typeof (float)); } public override float ToSingle (long value) { throw Error (typeof (long), typeof (float)); } public override float ToSingle (object value) { if (value == null) throw new ArgumentNullException ("value"); throw Error (value.GetType (), typeof (float)); } public override float ToSingle (float value) { throw Error (typeof (float), typeof (float)); } public override float ToSingle (string value) { throw Error (typeof (string), typeof (float)); } public override int ToInt32 (bool value) { throw Error (typeof (bool), typeof (int)); } public override int ToInt32 (DateTime value) { throw Error (typeof (DateTime), typeof (int)); } public override int ToInt32 (decimal value) { throw Error (typeof (decimal), typeof (int)); } public override int ToInt32 (double value) { throw Error (typeof (double), typeof (int)); } public override int ToInt32 (int value) { throw Error (typeof (int), typeof (int)); } public override int ToInt32 (long value) { throw Error (typeof (long), typeof (int)); } public override int ToInt32 (object value) { if (value == null) throw new ArgumentNullException ("value"); throw Error (value.GetType (), typeof (int)); } public override int ToInt32 (float value) { throw Error (typeof (float), typeof (int)); } public override int ToInt32 (string value) { throw Error (typeof (string), typeof (int)); } public override long ToInt64 (bool value) { throw Error (typeof (bool), typeof (long)); } public override long ToInt64 (DateTime value) { throw Error (typeof (DateTime), typeof (long)); } public override long ToInt64 (decimal value) { throw Error (typeof (decimal), typeof (long)); } public override long ToInt64 (double value) { throw Error (typeof (double), typeof (long)); } public override long ToInt64 (int value) { throw Error (typeof (int), typeof (long)); } public override long ToInt64 (long value) { throw Error (typeof (long), typeof (long)); } public override long ToInt64 (object value) { if (value == null) throw new ArgumentNullException ("value"); throw Error (value.GetType (), typeof (long)); } public override long ToInt64 (float value) { throw Error (typeof (float), typeof (long)); } public override long ToInt64 (string value) { throw Error (typeof (string), typeof (long)); } public override string ToString (bool value) { throw Error (typeof (bool), typeof (string)); } public override string ToString (DateTime value) { throw Error (typeof (DateTime), typeof (string)); } public override string ToString (decimal value) { throw Error (typeof (decimal), typeof (string)); } public override string ToString (double value) { throw Error (typeof (double), typeof (string)); } public override string ToString (int value) { throw Error (typeof (int), typeof (string)); } public override string ToString (long value) { throw Error (typeof (long), typeof (string)); } public override string ToString (object value) { return ToString (value, null); } public override string ToString (object value, IXmlNamespaceResolver nsResolver) { if (value == null) throw new ArgumentNullException ("value"); throw Error (value.GetType (), typeof (string)); } public override string ToString (float value) { throw Error (typeof (float), typeof (string)); } public override string ToString (string value) { return ToString (value, null); } public override string ToString (string value, IXmlNamespaceResolver nsResolver) { throw Error (typeof (string), typeof (string)); } } internal class XsdLaxConverter : XsdNonPermissiveConverter { public XsdLaxConverter (XmlTypeCode code) : base (code) { } public override string ToString (bool value) { return XmlConvert.ToString (value); } public override string ToString (decimal value) { return XmlConvert.ToString (value); } public override string ToString (double value) { return XmlConvert.ToString (value); } public override string ToString (int value) { return XmlConvert.ToString (value); } public override string ToString (long value) { return XmlConvert.ToString (value); } public override string ToString (object value) { return ChangeType (value, typeof (string)) as string; } public override string ToString (float value) { return XmlConvert.ToString (value); } public override bool ToBoolean (bool value) { return value; } public override decimal ToDecimal (decimal value) { return value; } public override decimal ToDecimal (double value) { return (decimal) value; } public override decimal ToDecimal (int value) { return (decimal) value; } public override decimal ToDecimal (long value) { return (decimal) value; } [MonoTODO] public override decimal ToDecimal (object value) { return (decimal) ChangeType (value, typeof (decimal)); } public override decimal ToDecimal (float value) { return (decimal) value; } public override double ToDouble (decimal value) { return (double) value; } public override double ToDouble (double value) { return (double) value; } public override double ToDouble (int value) { return (double) value; } public override double ToDouble (long value) { return (double) value; } [MonoTODO] public override double ToDouble (object value) { return (double) ChangeType (value, typeof (double)); } public override double ToDouble (float value) { return (double) value; } public override float ToSingle (decimal value) { return (float) value; } public override float ToSingle (double value) { return (float) value; } public override float ToSingle (int value) { return (float) value; } public override float ToSingle (long value) { return (float) value; } [MonoTODO] public override float ToSingle (object value) { return (float) ChangeType (value, typeof (float)); } public override float ToSingle (float value) { return (float) value; } public override int ToInt32 (int value) { return value; } public override int ToInt32 (long value) { return XQueryConvert.IntegerToInt (value); } [MonoTODO] public override int ToInt32 (object value) { return (int) ChangeType (value, typeof (int)); } public override long ToInt64 (int value) { return value; } public override long ToInt64 (long value) { return value; } [MonoTODO] public override long ToInt64 (object value) { return (long) ChangeType (value, typeof (long)); } } internal class XsdAnyTypeConverter : XsdNumericConverter { public XsdAnyTypeConverter (XmlTypeCode code) : base (code) { } #region boolean public override bool ToBoolean (decimal value) { return value != 0; } public override bool ToBoolean (double value) { return value != 0; } public override bool ToBoolean (int value) { return value != 0; } public override bool ToBoolean (long value) { return value != 0; } [MonoTODO] public override bool ToBoolean (object value) { return (bool) ChangeType (value, typeof (bool)); } public override bool ToBoolean (float value) { return value != 0; } public override decimal ToDecimal (bool value) { return value ? 1 : 0; } public override double ToDouble (bool value) { return value ? 1 : 0; } public override float ToSingle (bool value) { return value ? 1 : 0; } public override int ToInt32 (bool value) { return value ? 1 : 0; } public override long ToInt64 (bool value) { return value ? 1 : 0; } #endregion #region string public override DateTime ToDateTime (DateTime value) { return value; } public override string ToString (DateTime value) { return XmlConvert.ToString (value); } public override string ToString (string value) { return value; } #endregion } internal class XsdStringConverter : XsdLaxConverter { public XsdStringConverter (XmlTypeCode code) : base (code) { } public override DateTime ToDateTime (DateTime value) { return value; } public override string ToString (DateTime value) { return XmlConvert.ToString (value); } public override string ToString (string value) { return value; } } internal class XsdNumericConverter : XsdLaxConverter { public XsdNumericConverter (XmlTypeCode code) : base (code) { } #region boolean public override bool ToBoolean (decimal value) { return value != 0; } public override bool ToBoolean (double value) { return value != 0; } public override bool ToBoolean (int value) { return value != 0; } public override bool ToBoolean (long value) { return value != 0; } [MonoTODO] public override bool ToBoolean (object value) { return (bool) ChangeType (value, typeof (bool)); } public override bool ToBoolean (float value) { return value != 0; } public override decimal ToDecimal (bool value) { return value ? 1 : 0; } public override double ToDouble (bool value) { return value ? 1 : 0; } public override float ToSingle (bool value) { return value ? 1 : 0; } public override int ToInt32 (bool value) { return value ? 1 : 0; } public override long ToInt64 (bool value) { return value ? 1 : 0; } #endregion #region numeric with point to without point public override int ToInt32 (decimal value) { return XQueryConvert.DecimalToInt (value); } public override int ToInt32 (double value) { return XQueryConvert.DoubleToInt (value); } public override int ToInt32 (float value) { return XQueryConvert.FloatToInt (value); } public override long ToInt64 (decimal value) { return XQueryConvert.DecimalToInteger (value); } public override long ToInt64 (double value) { return XQueryConvert.DoubleToInteger (value); } public override long ToInt64 (float value) { return XQueryConvert.FloatToInteger (value); } #endregion } internal class XsdDateTimeConverter : XsdNonPermissiveConverter { public XsdDateTimeConverter (XmlTypeCode code) : base (code) { } public override string ToString (DateTime value) { return XmlConvert.ToString (value); } public override DateTime ToDateTime (DateTime value) { return value; } } internal class XsdBooleanConverter : XsdNumericConverter { public XsdBooleanConverter (XmlTypeCode code) : base (code) { } } internal class XsdMiscBaseConverter : XsdNonPermissiveConverter { public XsdMiscBaseConverter (XmlTypeCode code) : base (code) { } public override string ToString (string value) { return value; } public override object ChangeType (object value, Type type, IXmlNamespaceResolver nsResolver) { if (Code == XmlTypeCode.HexBinary) { if (value == null) throw new ArgumentNullException ("value"); if (type == null) throw new ArgumentNullException ("type"); if (value.GetType () == typeof (byte [])) { if (type == typeof (string)) return XQueryConvert.HexBinaryToString ((byte []) value); else if (type == typeof (byte [])) return value; } } return base.ChangeType (value, type, nsResolver); } } } #endif