The Labs \ Source Viewer \ SSCLI \ System.Xml.Schema \ XmlListConverter

  1. //------------------------------------------------------------------------------
  2. // <copyright file="XmlValueConverter.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. using System;
  16. using System.Xml;
  17. using System.Xml.XPath;
  18. using System.Globalization;
  19. using System.Diagnostics;
  20. using System.Collections;
  21. using System.Collections.Generic;
  22. using System.Xml.Schema;
  23. using System.IO;
  24. using System.Text;
  25. using System.Runtime.InteropServices;
  26. namespace System.Xml.Schema
  27. {
  28.    
  29.     //
  30.     // NOTE!!! LARGE PORTIONS OF THIS FILE ARE AUTOGENERATED BY GENERATECONVERTER.CS. DO NOT MANUALLY CHANGE ANY CODE
  31.     // WITHIN #REGION. INSTEAD, MODIFY GENERATECONVERTER.CS.
  32.     //
  33.    
  34.     // SUMMARY
  35.     // =======
  36.     // For each Xml type, there is a set of Clr types that can represent it. Some of these mappings involve
  37.     // loss of fidelity. For example, xsd:dateTime can be represented as System.DateTime, but only at the expense
  38.     // of normalizing the time zone. And xs:duration can be represented as System.TimeSpan, but only at the expense
  39.     // of discarding variations such as "P50H", "P1D26H", "P2D2H", all of which are normalized as "P2D2H".
  40.     //
  41.     // Implementations of this class convert between the various Clr representations of Xml types. Note that
  42.     // in *no* case is the Xml type ever modified. Only the Clr type is changed. This means that in cases where
  43.     // the Xml type is part of the representation (such as XmlAtomicValue), the destination value is guaranteed
  44.     // to have the same Xml type.
  45.     //
  46.     // For all converters, converting to typeof(object) is identical to converting to XmlSchemaType.Datatype.ValueType.
  47.     //
  48.     //
  49.     // ATOMIC MAPPINGS
  50.     // ===============
  51.     //
  52.     // -----------------------------------------------------------------------------------------------------------
  53.     // Source/Destination System.String Other Clr Type
  54.     // -----------------------------------------------------------------------------------------------------------
  55.     // System.String No-op conversion. Use Xsd rules to convert from the string
  56.     // to primitive, full-fidelity Clr type (use
  57.     // XmlConvert where possible). Use Clr rules
  58.     // to convert to destination type.
  59.     // -----------------------------------------------------------------------------------------------------------
  60.     // Other Clr Type Use Clr rules to convert from Use Clr rules to convert from source to
  61.     // source type to primitive, full- destination type.
  62.     // fidelity Clr type. Use Xsd rules
  63.     // to convert to a string (use
  64.     // XmlConvert where possible).
  65.     // -----------------------------------------------------------------------------------------------------------
  66.     //
  67.     //
  68.     // LIST MAPPINGS
  69.     // =============
  70.     // The following Clr types can be used to represent Xsd list types: IList, ICollection, IEnumerable, Type[],
  71.     // String.
  72.     //
  73.     // -----------------------------------------------------------------------------------------------------------
  74.     // Source/Destination System.String Clr List Type
  75.     // -----------------------------------------------------------------------------------------------------------
  76.     // System.String No-op conversion Tokenize the string by whitespace, create a
  77.     // String[] from tokens, and follow List => List
  78.     // rules.
  79.     // -----------------------------------------------------------------------------------------------------------
  80.     // Clr List Type Follow List => String[] rules, Create destination list having the same length
  81.     // then concatenate strings from array, as the source list. For each item in the
  82.     // separating adjacent strings with a source list, call the atomic converter to
  83.     // single space character. convert to the destination type. The destination
  84.     // item type for IList, ICollection, IEnumerable
  85.     // is typeof(object). The destination item type
  86.     // for Type[] is Type.
  87.     // -----------------------------------------------------------------------------------------------------------
  88.     //
  89.     //
  90.     // UNION MAPPINGS
  91.     // ==============
  92.     // Union types may only be represented using System.Xml.Schema.XmlAtomicValue or System.String. Either the
  93.     // source type or the destination type must therefore always be either System.String or
  94.     // System.Xml.Schema.XmlAtomicValue.
  95.     //
  96.     // -----------------------------------------------------------------------------------------------------------
  97.     // Source/Destination System.String XmlAtomicValue Other Clr Type
  98.     // -----------------------------------------------------------------------------------------------------------
  99.     // System.String No-op conversion Follow System.String=> Call ParseValue in order to determine
  100.     // Other Clr Type rules. the member type. Call ChangeType on
  101.     // the member type's converter to convert
  102.     // to desired Clr type.
  103.     // -----------------------------------------------------------------------------------------------------------
  104.     // XmlAtomicValue Follow XmlAtomicValue No-op conversion. Call ReadValueAs, where destinationType
  105.     // => Other Clr Type is the desired Clr type.
  106.     // rules.
  107.     // -----------------------------------------------------------------------------------------------------------
  108.     // Other Clr Type InvalidCastException InvalidCastException InvalidCastException
  109.     // -----------------------------------------------------------------------------------------------------------
  110.     //
  111.     //
  112.     // EXAMPLES
  113.     // ========
  114.     //
  115.     // -----------------------------------------------------------------------------------------------------------
  116.     // Source Destination
  117.     // Xml Type Value Type Conversion Steps Explanation
  118.     // -----------------------------------------------------------------------------------------------------------
  119.     // xs:int "10" Byte "10" => 10M => (byte) 10 Primitive, full-fidelity for xs:int
  120.     // is a truncated decimal
  121.     // -----------------------------------------------------------------------------------------------------------
  122.     // xs:int "10.10" Byte FormatException xs:integer parsing rules do not
  123.     // allow fractional parts
  124.     // -----------------------------------------------------------------------------------------------------------
  125.     // xs:int 10.10M Byte 10.10M => (byte) 10 Default Clr rules truncate when
  126.     // converting from Decimal to Byte
  127.     // -----------------------------------------------------------------------------------------------------------
  128.     // xs:int 10.10M Decimal 10.10M => 10.10M Decimal => Decimal is no-op
  129.     // -----------------------------------------------------------------------------------------------------------
  130.     // xs:int 10.10M String 10.10M => 10M => "10"
  131.     // -----------------------------------------------------------------------------------------------------------
  132.     // xs:int "hello" String "hello" => "hello" String => String is no-op
  133.     // -----------------------------------------------------------------------------------------------------------
  134.     // xs:byte "300" Int32 "300" => 300M => (int) 300
  135.     // -----------------------------------------------------------------------------------------------------------
  136.     // xs:byte 300 Byte 300 => 300M => OverflowException Clr overflows when converting from
  137.     // Decimal to Byte
  138.     // -----------------------------------------------------------------------------------------------------------
  139.     // xs:byte 300 XmlAtomicValue new XmlAtomicValue(xs:byte, 300) Invalid atomic value created
  140.     // -----------------------------------------------------------------------------------------------------------
  141.     // xs:double 1.234f String 1.234f => 1.2339999675750732d => Converting a Single value to a Double
  142.     // "1.2339999675750732" value zero-extends it in base-2, so
  143.     // "garbage" digits appear when it's
  144.     // converted to base-10.
  145.     // -----------------------------------------------------------------------------------------------------------
  146.     // xs:int* {1, "2", String {1, "2", 3.1M} => Delegate to xs:int converter to
  147.     // 3.1M} {"1", "2", "3"} => "1 2 3" convert each item to a string.
  148.     // -----------------------------------------------------------------------------------------------------------
  149.     // xs:int* "1 2 3" Int32[] "1 2 3" => {"1", "2", "3"} =>
  150.     // {1, 2, 3}
  151.     // -----------------------------------------------------------------------------------------------------------
  152.     // xs:int* {1, "2", Object[] {1, "2", 3.1M} => xs:int converter uses Int32 by default,
  153.     // 3.1M} {(object)1, (object)2, (object)3} so returns boxed Int32 values.
  154.     // -----------------------------------------------------------------------------------------------------------
  155.     // (xs:int | "1 2001" XmlAtomicValue[] "1 2001" => {(xs:int) 1,
  156.     // xs:gYear)* (xs:gYear) 2001}
  157.     // -----------------------------------------------------------------------------------------------------------
  158.     // (xs:int* | "1 2001" String "1 2001" No-op conversion even though
  159.     // xs:gYear*) ParseValue would fail if it were called.
  160.     // -----------------------------------------------------------------------------------------------------------
  161.     // (xs:int* | "1 2001" Int[] XmlSchemaException ParseValue fails.
  162.     // xs:gYear*)
  163.     // -----------------------------------------------------------------------------------------------------------
  164.     //
  165.     internal abstract class XmlValueConverter
  166.     {
  167.         public abstract bool ToBoolean(bool value);
  168.         public abstract bool ToBoolean(long value);
  169.         public abstract bool ToBoolean(int value);
  170.         public abstract bool ToBoolean(decimal value);
  171.         public abstract bool ToBoolean(float value);
  172.         public abstract bool ToBoolean(double value);
  173.         public abstract bool ToBoolean(DateTime value);
  174.         public abstract bool ToBoolean(string value);
  175.         public abstract bool ToBoolean(object value);
  176.        
  177.         public abstract int ToInt32(bool value);
  178.         public abstract int ToInt32(int value);
  179.         public abstract int ToInt32(long value);
  180.         public abstract int ToInt32(decimal value);
  181.         public abstract int ToInt32(float value);
  182.         public abstract int ToInt32(double value);
  183.         public abstract int ToInt32(DateTime value);
  184.         public abstract int ToInt32(string value);
  185.         public abstract int ToInt32(object value);
  186.        
  187.         public abstract long ToInt64(bool value);
  188.         public abstract long ToInt64(int value);
  189.         public abstract long ToInt64(long value);
  190.         public abstract long ToInt64(decimal value);
  191.         public abstract long ToInt64(float value);
  192.         public abstract long ToInt64(double value);
  193.         public abstract long ToInt64(DateTime value);
  194.         public abstract long ToInt64(string value);
  195.         public abstract long ToInt64(object value);
  196.        
  197.         public abstract decimal ToDecimal(bool value);
  198.         public abstract decimal ToDecimal(int value);
  199.         public abstract decimal ToDecimal(long value);
  200.         public abstract decimal ToDecimal(decimal value);
  201.         public abstract decimal ToDecimal(float value);
  202.         public abstract decimal ToDecimal(double value);
  203.         public abstract decimal ToDecimal(DateTime value);
  204.         public abstract decimal ToDecimal(string value);
  205.         public abstract decimal ToDecimal(object value);
  206.        
  207.         public abstract double ToDouble(bool value);
  208.         public abstract double ToDouble(int value);
  209.         public abstract double ToDouble(long value);
  210.         public abstract double ToDouble(decimal value);
  211.         public abstract double ToDouble(float value);
  212.         public abstract double ToDouble(double value);
  213.         public abstract double ToDouble(DateTime value);
  214.         public abstract double ToDouble(string value);
  215.         public abstract double ToDouble(object value);
  216.        
  217.         public abstract float ToSingle(bool value);
  218.         public abstract float ToSingle(int value);
  219.         public abstract float ToSingle(long value);
  220.         public abstract float ToSingle(decimal value);
  221.         public abstract float ToSingle(float value);
  222.         public abstract float ToSingle(double value);
  223.         public abstract float ToSingle(DateTime value);
  224.         public abstract float ToSingle(string value);
  225.         public abstract float ToSingle(object value);
  226.        
  227.         public abstract DateTime ToDateTime(bool value);
  228.         public abstract DateTime ToDateTime(int value);
  229.         public abstract DateTime ToDateTime(long value);
  230.         public abstract DateTime ToDateTime(decimal value);
  231.         public abstract DateTime ToDateTime(float value);
  232.         public abstract DateTime ToDateTime(double value);
  233.         public abstract DateTime ToDateTime(DateTime value);
  234.         public abstract DateTime ToDateTime(string value);
  235.         public abstract DateTime ToDateTime(object value);
  236.        
  237.         public abstract string ToString(bool value);
  238.         public abstract string ToString(int value);
  239.         public abstract string ToString(long value);
  240.         public abstract string ToString(decimal value);
  241.         public abstract string ToString(float value);
  242.         public abstract string ToString(double value);
  243.         public abstract string ToString(DateTime value);
  244.         public abstract string ToString(string value);
  245.         public abstract string ToString(string value, IXmlNamespaceResolver nsResolver);
  246.         public abstract string ToString(object value);
  247.         public abstract string ToString(object value, IXmlNamespaceResolver nsResolver);
  248.        
  249.         public abstract object ChangeType(bool value, Type destinationType);
  250.         public abstract object ChangeType(int value, Type destinationType);
  251.         public abstract object ChangeType(long value, Type destinationType);
  252.         public abstract object ChangeType(decimal value, Type destinationType);
  253.         public abstract object ChangeType(float value, Type destinationType);
  254.         public abstract object ChangeType(double value, Type destinationType);
  255.         public abstract object ChangeType(DateTime value, Type destinationType);
  256.         public abstract object ChangeType(string value, Type destinationType);
  257.         public abstract object ChangeType(string value, Type destinationType, IXmlNamespaceResolver nsResolver);
  258.         public abstract object ChangeType(object value, Type destinationType);
  259.         public abstract object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver);
  260.     }
  261.    
  262.     internal abstract class XmlBaseConverter : XmlValueConverter
  263.     {
  264.         private XmlSchemaType schemaType;
  265.         private XmlTypeCode typeCode;
  266.         private Type clrTypeDefault;
  267.        
  268.         protected XmlBaseConverter(XmlSchemaType schemaType)
  269.         {
  270.            
  271.             // XmlValueConverter is defined only on types with simple content
  272.             XmlSchemaDatatype datatype = schemaType.Datatype;
  273.             Debug.Assert(schemaType != null && datatype != null, "schemaType or schemaType.Datatype may not be null");
  274.            
  275.             while (schemaType != null && !(schemaType is XmlSchemaSimpleType)) {
  276.                 schemaType = schemaType.BaseXmlSchemaType;
  277.             }
  278.             if (schemaType == null) {
  279.                 //Did not find any simple type in the parent chain
  280.                 schemaType = XmlSchemaType.GetBuiltInSimpleType(datatype.TypeCode);
  281.             }
  282.             Debug.Assert(schemaType.Datatype.Variety != XmlSchemaDatatypeVariety.List, "schemaType must be list's item type, not list itself");
  283.            
  284.             this.schemaType = schemaType;
  285.             this.typeCode = schemaType.TypeCode;
  286.             this.clrTypeDefault = schemaType.Datatype.ValueType;
  287.         }
  288.        
  289.         protected XmlBaseConverter(XmlTypeCode typeCode)
  290.         {
  291.             switch (typeCode) {
  292.                 case XmlTypeCode.Item:
  293.                     this.clrTypeDefault = XPathItemType;
  294.                     break;
  295.                 case XmlTypeCode.Node:
  296.                    
  297.                     this.clrTypeDefault = XPathNavigatorType;
  298.                     break;
  299.                 case XmlTypeCode.AnyAtomicType:
  300.                    
  301.                     this.clrTypeDefault = XmlAtomicValueType;
  302.                     break;
  303.                 default:
  304.                    
  305.                     Debug.Assert(false, "Type code " + typeCode + " is not supported.");
  306.                     break;
  307.             }
  308.            
  309.             this.typeCode = typeCode;
  310.         }
  311.        
  312.         protected XmlBaseConverter(XmlBaseConverter converterAtomic)
  313.         {
  314.             this.schemaType = converterAtomic.schemaType;
  315.             this.typeCode = converterAtomic.typeCode;
  316.             this.clrTypeDefault = Array.CreateInstance(converterAtomic.DefaultClrType, 0).GetType();
  317.         }
  318.        
  319.         protected XmlBaseConverter(XmlBaseConverter converterAtomic, Type clrTypeDefault)
  320.         {
  321.             this.schemaType = converterAtomic.schemaType;
  322.             this.typeCode = converterAtomic.typeCode;
  323.             this.clrTypeDefault = clrTypeDefault;
  324.         }
  325.        
  326.         protected static readonly Type ICollectionType = typeof(ICollection);
  327.         protected static readonly Type IEnumerableType = typeof(IEnumerable);
  328.         protected static readonly Type IListType = typeof(IList);
  329.         protected static readonly Type ObjectArrayType = typeof(object[]);
  330.         protected static readonly Type StringArrayType = typeof(string[]);
  331.         protected static readonly Type XmlAtomicValueArrayType = typeof(XmlAtomicValue[]);
  332.        
  333.         #region AUTOGENERATED_XMLBASECONVERTER
  334.         protected static readonly Type DecimalType = typeof(decimal);
  335.         protected static readonly Type Int32Type = typeof(int);
  336.         protected static readonly Type Int64Type = typeof(long);
  337.         protected static readonly Type StringType = typeof(string);
  338.         protected static readonly Type XmlAtomicValueType = typeof(XmlAtomicValue);
  339.         protected static readonly Type ObjectType = typeof(object);
  340.         protected static readonly Type ByteType = typeof(byte);
  341.         protected static readonly Type Int16Type = typeof(short);
  342.         protected static readonly Type SByteType = typeof(sbyte);
  343.         protected static readonly Type UInt16Type = typeof(ushort);
  344.         protected static readonly Type UInt32Type = typeof(uint);
  345.         protected static readonly Type UInt64Type = typeof(ulong);
  346.         protected static readonly Type XPathItemType = typeof(XPathItem);
  347.         protected static readonly Type DoubleType = typeof(double);
  348.         protected static readonly Type SingleType = typeof(float);
  349.         protected static readonly Type DateTimeType = typeof(DateTime);
  350.         protected static readonly Type BooleanType = typeof(bool);
  351.         protected static readonly Type ByteArrayType = typeof(byte[]);
  352.         protected static readonly Type XmlQualifiedNameType = typeof(XmlQualifiedName);
  353.         protected static readonly Type UriType = typeof(Uri);
  354.         protected static readonly Type TimeSpanType = typeof(TimeSpan);
  355.         protected static readonly Type XPathNavigatorType = typeof(XPathNavigator);
  356.        
  357.         public override bool ToBoolean(bool value)
  358.         {
  359.             return (bool)ChangeType((object)value, BooleanType, null);
  360.         }
  361.         public override bool ToBoolean(DateTime value)
  362.         {
  363.             return (bool)ChangeType((object)value, BooleanType, null);
  364.         }
  365.         public override bool ToBoolean(decimal value)
  366.         {
  367.             return (bool)ChangeType((object)value, BooleanType, null);
  368.         }
  369.         public override bool ToBoolean(double value)
  370.         {
  371.             return (bool)ChangeType((object)value, BooleanType, null);
  372.         }
  373.         public override bool ToBoolean(int value)
  374.         {
  375.             return (bool)ChangeType((object)value, BooleanType, null);
  376.         }
  377.         public override bool ToBoolean(long value)
  378.         {
  379.             return (bool)ChangeType((object)value, BooleanType, null);
  380.         }
  381.         public override bool ToBoolean(float value)
  382.         {
  383.             return (bool)ChangeType((object)value, BooleanType, null);
  384.         }
  385.         public override bool ToBoolean(string value)
  386.         {
  387.             return (bool)ChangeType((object)value, BooleanType, null);
  388.         }
  389.         public override bool ToBoolean(object value)
  390.         {
  391.             return (bool)ChangeType((object)value, BooleanType, null);
  392.         }
  393.        
  394.         public override DateTime ToDateTime(bool value)
  395.         {
  396.             return (DateTime)ChangeType((object)value, DateTimeType, null);
  397.         }
  398.         public override DateTime ToDateTime(DateTime value)
  399.         {
  400.             return (DateTime)ChangeType((object)value, DateTimeType, null);
  401.         }
  402.         public override DateTime ToDateTime(decimal value)
  403.         {
  404.             return (DateTime)ChangeType((object)value, DateTimeType, null);
  405.         }
  406.         public override DateTime ToDateTime(double value)
  407.         {
  408.             return (DateTime)ChangeType((object)value, DateTimeType, null);
  409.         }
  410.         public override DateTime ToDateTime(int value)
  411.         {
  412.             return (DateTime)ChangeType((object)value, DateTimeType, null);
  413.         }
  414.         public override DateTime ToDateTime(long value)
  415.         {
  416.             return (DateTime)ChangeType((object)value, DateTimeType, null);
  417.         }
  418.         public override DateTime ToDateTime(float value)
  419.         {
  420.             return (DateTime)ChangeType((object)value, DateTimeType, null);
  421.         }
  422.         public override DateTime ToDateTime(string value)
  423.         {
  424.             return (DateTime)ChangeType((object)value, DateTimeType, null);
  425.         }
  426.         public override DateTime ToDateTime(object value)
  427.         {
  428.             return (DateTime)ChangeType((object)value, DateTimeType, null);
  429.         }
  430.        
  431.         public override decimal ToDecimal(bool value)
  432.         {
  433.             return (decimal)ChangeType((object)value, DecimalType, null);
  434.         }
  435.         public override decimal ToDecimal(DateTime value)
  436.         {
  437.             return (decimal)ChangeType((object)value, DecimalType, null);
  438.         }
  439.         public override decimal ToDecimal(decimal value)
  440.         {
  441.             return (decimal)ChangeType((object)value, DecimalType, null);
  442.         }
  443.         public override decimal ToDecimal(double value)
  444.         {
  445.             return (decimal)ChangeType((object)value, DecimalType, null);
  446.         }
  447.         public override decimal ToDecimal(int value)
  448.         {
  449.             return (decimal)ChangeType((object)value, DecimalType, null);
  450.         }
  451.         public override decimal ToDecimal(long value)
  452.         {
  453.             return (decimal)ChangeType((object)value, DecimalType, null);
  454.         }
  455.         public override decimal ToDecimal(float value)
  456.         {
  457.             return (decimal)ChangeType((object)value, DecimalType, null);
  458.         }
  459.         public override decimal ToDecimal(string value)
  460.         {
  461.             return (decimal)ChangeType((object)value, DecimalType, null);
  462.         }
  463.         public override decimal ToDecimal(object value)
  464.         {
  465.             return (decimal)ChangeType((object)value, DecimalType, null);
  466.         }
  467.        
  468.         public override double ToDouble(bool value)
  469.         {
  470.             return (double)ChangeType((object)value, DoubleType, null);
  471.         }
  472.         public override double ToDouble(DateTime value)
  473.         {
  474.             return (double)ChangeType((object)value, DoubleType, null);
  475.         }
  476.         public override double ToDouble(decimal value)
  477.         {
  478.             return (double)ChangeType((object)value, DoubleType, null);
  479.         }
  480.         public override double ToDouble(double value)
  481.         {
  482.             return (double)ChangeType((object)value, DoubleType, null);
  483.         }
  484.         public override double ToDouble(int value)
  485.         {
  486.             return (double)ChangeType((object)value, DoubleType, null);
  487.         }
  488.         public override double ToDouble(long value)
  489.         {
  490.             return (double)ChangeType((object)value, DoubleType, null);
  491.         }
  492.         public override double ToDouble(float value)
  493.         {
  494.             return (double)ChangeType((object)value, DoubleType, null);
  495.         }
  496.         public override double ToDouble(string value)
  497.         {
  498.             return (double)ChangeType((object)value, DoubleType, null);
  499.         }
  500.         public override double ToDouble(object value)
  501.         {
  502.             return (double)ChangeType((object)value, DoubleType, null);
  503.         }
  504.        
  505.         public override int ToInt32(bool value)
  506.         {
  507.             return (int)ChangeType((object)value, Int32Type, null);
  508.         }
  509.         public override int ToInt32(DateTime value)
  510.         {
  511.             return (int)ChangeType((object)value, Int32Type, null);
  512.         }
  513.         public override int ToInt32(decimal value)
  514.         {
  515.             return (int)ChangeType((object)value, Int32Type, null);
  516.         }
  517.         public override int ToInt32(double value)
  518.         {
  519.             return (int)ChangeType((object)value, Int32Type, null);
  520.         }
  521.         public override int ToInt32(int value)
  522.         {
  523.             return (int)ChangeType((object)value, Int32Type, null);
  524.         }
  525.         public override int ToInt32(long value)
  526.         {
  527.             return (int)ChangeType((object)value, Int32Type, null);
  528.         }
  529.         public override int ToInt32(float value)
  530.         {
  531.             return (int)ChangeType((object)value, Int32Type, null);
  532.         }
  533.         public override int ToInt32(string value)
  534.         {
  535.             return (int)ChangeType((object)value, Int32Type, null);
  536.         }
  537.         public override int ToInt32(object value)
  538.         {
  539.             return (int)ChangeType((object)value, Int32Type, null);
  540.         }
  541.        
  542.         public override long ToInt64(bool value)
  543.         {
  544.             return (long)ChangeType((object)value, Int64Type, null);
  545.         }
  546.         public override long ToInt64(DateTime value)
  547.         {
  548.             return (long)ChangeType((object)value, Int64Type, null);
  549.         }
  550.         public override long ToInt64(decimal value)
  551.         {
  552.             return (long)ChangeType((object)value, Int64Type, null);
  553.         }
  554.         public override long ToInt64(double value)
  555.         {
  556.             return (long)ChangeType((object)value, Int64Type, null);
  557.         }
  558.         public override long ToInt64(int value)
  559.         {
  560.             return (long)ChangeType((object)value, Int64Type, null);
  561.         }
  562.         public override long ToInt64(long value)
  563.         {
  564.             return (long)ChangeType((object)value, Int64Type, null);
  565.         }
  566.         public override long ToInt64(float value)
  567.         {
  568.             return (long)ChangeType((object)value, Int64Type, null);
  569.         }
  570.         public override long ToInt64(string value)
  571.         {
  572.             return (long)ChangeType((object)value, Int64Type, null);
  573.         }
  574.         public override long ToInt64(object value)
  575.         {
  576.             return (long)ChangeType((object)value, Int64Type, null);
  577.         }
  578.        
  579.         public override float ToSingle(bool value)
  580.         {
  581.             return (float)ChangeType((object)value, SingleType, null);
  582.         }
  583.         public override float ToSingle(DateTime value)
  584.         {
  585.             return (float)ChangeType((object)value, SingleType, null);
  586.         }
  587.         public override float ToSingle(decimal value)
  588.         {
  589.             return (float)ChangeType((object)value, SingleType, null);
  590.         }
  591.         public override float ToSingle(double value)
  592.         {
  593.             return (float)ChangeType((object)value, SingleType, null);
  594.         }
  595.         public override float ToSingle(int value)
  596.         {
  597.             return (float)ChangeType((object)value, SingleType, null);
  598.         }
  599.         public override float ToSingle(long value)
  600.         {
  601.             return (float)ChangeType((object)value, SingleType, null);
  602.         }
  603.         public override float ToSingle(float value)
  604.         {
  605.             return (float)ChangeType((object)value, SingleType, null);
  606.         }
  607.         public override float ToSingle(string value)
  608.         {
  609.             return (float)ChangeType((object)value, SingleType, null);
  610.         }
  611.         public override float ToSingle(object value)
  612.         {
  613.             return (float)ChangeType((object)value, SingleType, null);
  614.         }
  615.        
  616.         public override string ToString(bool value)
  617.         {
  618.             return (string)ChangeType((object)value, StringType, null);
  619.         }
  620.         public override string ToString(DateTime value)
  621.         {
  622.             return (string)ChangeType((object)value, StringType, null);
  623.         }
  624.         public override string ToString(decimal value)
  625.         {
  626.             return (string)ChangeType((object)value, StringType, null);
  627.         }
  628.         public override string ToString(double value)
  629.         {
  630.             return (string)ChangeType((object)value, StringType, null);
  631.         }
  632.         public override string ToString(int value)
  633.         {
  634.             return (string)ChangeType((object)value, StringType, null);
  635.         }
  636.         public override string ToString(long value)
  637.         {
  638.             return (string)ChangeType((object)value, StringType, null);
  639.         }
  640.         public override string ToString(float value)
  641.         {
  642.             return (string)ChangeType((object)value, StringType, null);
  643.         }
  644.         public override string ToString(string value, IXmlNamespaceResolver nsResolver)
  645.         {
  646.             return (string)ChangeType((object)value, StringType, nsResolver);
  647.         }
  648.         public override string ToString(object value, IXmlNamespaceResolver nsResolver)
  649.         {
  650.             return (string)ChangeType((object)value, StringType, nsResolver);
  651.         }
  652.         public override string ToString(string value)
  653.         {
  654.             return this.ToString(value, null);
  655.         }
  656.         public override string ToString(object value)
  657.         {
  658.             return this.ToString(value, null);
  659.         }
  660.        
  661.         public override object ChangeType(bool value, Type destinationType)
  662.         {
  663.             return (object)ChangeType((object)value, destinationType, null);
  664.         }
  665.         public override object ChangeType(DateTime value, Type destinationType)
  666.         {
  667.             return (object)ChangeType((object)value, destinationType, null);
  668.         }
  669.         public override object ChangeType(decimal value, Type destinationType)
  670.         {
  671.             return (object)ChangeType((object)value, destinationType, null);
  672.         }
  673.         public override object ChangeType(double value, Type destinationType)
  674.         {
  675.             return (object)ChangeType((object)value, destinationType, null);
  676.         }
  677.         public override object ChangeType(int value, Type destinationType)
  678.         {
  679.             return (object)ChangeType((object)value, destinationType, null);
  680.         }
  681.         public override object ChangeType(long value, Type destinationType)
  682.         {
  683.             return (object)ChangeType((object)value, destinationType, null);
  684.         }
  685.         public override object ChangeType(float value, Type destinationType)
  686.         {
  687.             return (object)ChangeType((object)value, destinationType, null);
  688.         }
  689.         public override object ChangeType(string value, Type destinationType, IXmlNamespaceResolver nsResolver)
  690.         {
  691.             return (object)ChangeType((object)value, destinationType, nsResolver);
  692.         }
  693.         public override object ChangeType(string value, Type destinationType)
  694.         {
  695.             return this.ChangeType(value, destinationType, null);
  696.         }
  697.         public override object ChangeType(object value, Type destinationType)
  698.         {
  699.             return this.ChangeType(value, destinationType, null);
  700.         }
  701.        
  702.         #endregion
  703.        
  704.         /// <summary>
  705.         /// Return this converter's prime schema type (may be null in case of Node, Item, etc).
  706.         /// </summary>
  707.         protected XmlSchemaType SchemaType {
  708.             get { return this.schemaType; }
  709.         }
  710.        
  711.         /// <summary>
  712.         /// Return the XmlTypeCode of this converter's prime schema type.
  713.         /// </summary>
  714.         protected XmlTypeCode TypeCode {
  715.             get { return this.typeCode; }
  716.         }
  717.        
  718.         /// <summary>
  719.         /// Return a string representation of this converter's prime schema type.
  720.         /// </summary>
  721.         protected string XmlTypeName {
  722.             get {
  723.                 XmlSchemaType type = this.schemaType;
  724.                
  725.                 if (type != null) {
  726.                     while (type.QualifiedName.IsEmpty) {
  727.                         // Walk base classes until one with a name is found (in worst case, all simple types derive from xs:anySimpleType)
  728.                         type = type.BaseXmlSchemaType;
  729.                     }
  730.                    
  731.                     return QNameToString(type.QualifiedName);
  732.                 }
  733.                
  734.                 // SchemaType is null in the case of item, node, and xdt:anyAtomicType
  735.                 if (this.typeCode == XmlTypeCode.Node)
  736.                     return "node";
  737.                 if (this.typeCode == XmlTypeCode.AnyAtomicType)
  738.                     return "xdt:anyAtomicType";
  739.                
  740.                 Debug.Assert(this.typeCode == XmlTypeCode.Item, "If SchemaType is null, then TypeCode may only be Item, Node, or AnyAtomicType");
  741.                 return "item";
  742.             }
  743.         }
  744.        
  745.         /// <summary>
  746.         /// Return default V1 Clr mapping of this converter's type.
  747.         /// </summary>
  748.         protected Type DefaultClrType {
  749.             get { return this.clrTypeDefault; }
  750.         }
  751.        
  752.         /// <summary>
  753.         /// Type.IsSubtypeOf does not return true if types are equal, this method does.
  754.         /// </summary>
  755.         protected static bool IsDerivedFrom(Type derivedType, Type baseType)
  756.         {
  757.             while (derivedType != null) {
  758.                 if (derivedType == baseType)
  759.                     return true;
  760.                
  761.                 derivedType = derivedType.BaseType;
  762.             }
  763.             return false;
  764.         }
  765.        
  766.         /// <summary>
  767.         /// Create an InvalidCastException for cases where either "destinationType" or "sourceType" is not a supported CLR representation
  768.         /// for this Xml type.
  769.         /// </summary>
  770.         protected Exception CreateInvalidClrMappingException(Type sourceType, Type destinationType)
  771.         {
  772.             if (sourceType == destinationType)
  773.                 return new InvalidCastException(Res.GetString(Res.XmlConvert_TypeBadMapping, XmlTypeName, sourceType.Name));
  774.            
  775.             return new InvalidCastException(Res.GetString(Res.XmlConvert_TypeBadMapping2, XmlTypeName, sourceType.Name, destinationType.Name));
  776.         }
  777.        
  778.         /// <summary>
  779.         /// Convert an XmlQualifiedName to a string, using somewhat different rules than XmlQualifiedName.ToString():
  780.         /// 1. Recognize the built-in xs: and xdt: namespaces and print the short prefix rather than the long namespace
  781.         /// 2. Use brace characters "{", "}" around the namespace portion of the QName
  782.         /// </summary>
  783.         protected static string QNameToString(XmlQualifiedName name)
  784.         {
  785.             if (name.Namespace.Length == 0) {
  786.                 return name.Name;
  787.             }
  788.             else if (name.Namespace == XmlReservedNs.NsXs) {
  789.                 return "xs:" + name.Name;
  790.             }
  791.             else if (name.Namespace == XmlReservedNs.NsXQueryDataType) {
  792.                 return "xdt:" + name.Name;
  793.             }
  794.             else {
  795.                 return "{" + name.Namespace + "}" + name.Name;
  796.             }
  797.         }
  798.        
  799.         /// <summary>
  800.         /// This method is called when a valid conversion cannot be found. By default, this method throws an error. It can
  801.         /// be overriden in derived classes to support list conversions.
  802.         /// </summary>
  803.         protected virtual object ChangeListType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  804.         {
  805.             throw CreateInvalidClrMappingException(value.GetType(), destinationType);
  806.         }
  807.        
  808.        
  809.         //------------------------------------------------------------------------
  810.         // From String Conversion Helpers
  811.         //------------------------------------------------------------------------
  812.        
  813.         protected static byte[] StringToBase64Binary(string value)
  814.         {
  815.             return Convert.FromBase64String(XmlConvert.TrimString(value));
  816.         }
  817.        
  818.         protected static DateTime StringToDate(string value)
  819.         {
  820.             return (DateTime)(new XsdDateTime(value, XsdDateTimeFlags.Date));
  821.         }
  822.        
  823.         protected static DateTime StringToDateTime(string value)
  824.         {
  825.             return (DateTime)(new XsdDateTime(value, XsdDateTimeFlags.DateTime));
  826.         }
  827.        
  828.         protected static TimeSpan StringToDayTimeDuration(string value)
  829.         {
  830.             // Parse string as DayTimeDuration and convert it to a DayTimeDuration TimeSpan (it is an error to have year and month parts)
  831.             return new XsdDuration(value, XsdDuration.DurationType.DayTimeDuration).ToTimeSpan(XsdDuration.DurationType.DayTimeDuration);
  832.         }
  833.        
  834.         protected static TimeSpan StringToDuration(string value)
  835.         {
  836.             return new XsdDuration(value, XsdDuration.DurationType.Duration).ToTimeSpan(XsdDuration.DurationType.Duration);
  837.         }
  838.        
  839.         protected static DateTime StringToGDay(string value)
  840.         {
  841.             return (DateTime)(new XsdDateTime(value, XsdDateTimeFlags.GDay));
  842.         }
  843.        
  844.         protected static DateTime StringToGMonth(string value)
  845.         {
  846.             return (DateTime)(new XsdDateTime(value, XsdDateTimeFlags.GMonth));
  847.         }
  848.        
  849.         protected static DateTime StringToGMonthDay(string value)
  850.         {
  851.             return (DateTime)(new XsdDateTime(value, XsdDateTimeFlags.GMonthDay));
  852.         }
  853.        
  854.         protected static DateTime StringToGYear(string value)
  855.         {
  856.             return (DateTime)(new XsdDateTime(value, XsdDateTimeFlags.GYear));
  857.         }
  858.        
  859.         protected static DateTime StringToGYearMonth(string value)
  860.         {
  861.             return (DateTime)(new XsdDateTime(value, XsdDateTimeFlags.GYearMonth));
  862.         }
  863.        
  864.         protected static byte[] StringToHexBinary(string value)
  865.         {
  866.             try {
  867.                 return XmlConvert.FromBinHexString(XmlConvert.TrimString(value), false);
  868.             }
  869.             catch (XmlException e) {
  870.                 throw new FormatException(e.Message);
  871.             }
  872.         }
  873.        
  874.         protected static XmlQualifiedName StringToQName(string value, IXmlNamespaceResolver nsResolver)
  875.         {
  876.             string prefix;
  877.             string localName;
  878.             string ns;
  879.            
  880.             value = value.Trim();
  881.            
  882.             // Parse prefix:localName
  883.             try {
  884.                 ValidateNames.ParseQNameThrow(value, out prefix, out localName);
  885.             }
  886.             catch (XmlException e) {
  887.                 throw new FormatException(e.Message);
  888.             }
  889.            
  890.             // Throw error if no namespaces are in scope
  891.             if (nsResolver == null)
  892.                 throw new InvalidCastException(Res.GetString(Res.XmlConvert_TypeNoNamespace, value, prefix));
  893.            
  894.             // Lookup namespace
  895.             ns = nsResolver.LookupNamespace(prefix);
  896.             if (ns == null)
  897.                 throw new InvalidCastException(Res.GetString(Res.XmlConvert_TypeNoNamespace, value, prefix));
  898.            
  899.             // Create XmlQualfiedName
  900.             return new XmlQualifiedName(localName, ns);
  901.         }
  902.        
  903.         protected static DateTime StringToTime(string value)
  904.         {
  905.             return (DateTime)(new XsdDateTime(value, XsdDateTimeFlags.Time));
  906.         }
  907.        
  908.         protected static TimeSpan StringToYearMonthDuration(string value)
  909.         {
  910.             // Parse string as YearMonthDuration and convert it to a YearMonthDuration TimeSpan (it is an error to have day and time parts)
  911.             return new XsdDuration(value, XsdDuration.DurationType.YearMonthDuration).ToTimeSpan(XsdDuration.DurationType.YearMonthDuration);
  912.         }
  913.        
  914.        
  915.         //------------------------------------------------------------------------
  916.         // To String Conversion Helpers
  917.         //------------------------------------------------------------------------
  918.        
  919.         protected static string AnyUriToString(Uri value)
  920.         {
  921.             return value.OriginalString;
  922.         }
  923.        
  924.         protected static string Base64BinaryToString(byte[] value)
  925.         {
  926.             return Convert.ToBase64String(value);
  927.         }
  928.        
  929.         protected static string DateToString(DateTime value)
  930.         {
  931.             return (new XsdDateTime(value, XsdDateTimeFlags.Date)).ToString();
  932.         }
  933.        
  934.         protected static string DateTimeToString(DateTime value)
  935.         {
  936.             return (new XsdDateTime(value, XsdDateTimeFlags.DateTime)).ToString();
  937.         }
  938.        
  939.         protected static string DayTimeDurationToString(TimeSpan value)
  940.         {
  941.             return new XsdDuration(value, XsdDuration.DurationType.DayTimeDuration).ToString(XsdDuration.DurationType.DayTimeDuration);
  942.         }
  943.        
  944.         protected static string DurationToString(TimeSpan value)
  945.         {
  946.             return new XsdDuration(value, XsdDuration.DurationType.Duration).ToString(XsdDuration.DurationType.Duration);
  947.         }
  948.        
  949.         protected static string GDayToString(DateTime value)
  950.         {
  951.             return (new XsdDateTime(value, XsdDateTimeFlags.GDay)).ToString();
  952.         }
  953.        
  954.         protected static string GMonthToString(DateTime value)
  955.         {
  956.             return (new XsdDateTime(value, XsdDateTimeFlags.GMonth)).ToString();
  957.         }
  958.        
  959.         protected static string GMonthDayToString(DateTime value)
  960.         {
  961.             return (new XsdDateTime(value, XsdDateTimeFlags.GMonthDay)).ToString();
  962.         }
  963.        
  964.         protected static string GYearToString(DateTime value)
  965.         {
  966.             return (new XsdDateTime(value, XsdDateTimeFlags.GYear)).ToString();
  967.         }
  968.        
  969.         protected static string GYearMonthToString(DateTime value)
  970.         {
  971.             return (new XsdDateTime(value, XsdDateTimeFlags.GYearMonth)).ToString();
  972.         }
  973.        
  974.         protected static string QNameToString(XmlQualifiedName qname, IXmlNamespaceResolver nsResolver)
  975.         {
  976.             string prefix;
  977.            
  978.             if (nsResolver == null)
  979.                 return string.Concat("{", qname.Namespace, "}", qname.Name);
  980.            
  981.             prefix = nsResolver.LookupPrefix(qname.Namespace);
  982.             if (prefix == null)
  983.                 throw new InvalidCastException(Res.GetString(Res.XmlConvert_TypeNoPrefix, qname.ToString(), qname.Namespace));
  984.            
  985.             return (prefix.Length != 0) ? string.Concat(prefix, ":", qname.Name) : qname.Name;
  986.         }
  987.        
  988.         protected static string TimeToString(DateTime value)
  989.         {
  990.             return (new XsdDateTime(value, XsdDateTimeFlags.Time)).ToString();
  991.         }
  992.        
  993.         protected static string YearMonthDurationToString(TimeSpan value)
  994.         {
  995.             return new XsdDuration(value, XsdDuration.DurationType.YearMonthDuration).ToString(XsdDuration.DurationType.YearMonthDuration);
  996.         }
  997.        
  998.        
  999.         //------------------------------------------------------------------------
  1000.         // Other Conversion Helpers
  1001.         //------------------------------------------------------------------------
  1002.        
  1003.         static internal int DecimalToInt32(decimal value)
  1004.         {
  1005.             if (value < (decimal)Int32.MinValue || value > (decimal)Int32.MaxValue)
  1006.                 throw new OverflowException(Res.GetString(Res.XmlConvert_Overflow, new string[] {XmlConvert.ToString(value), "Int32"}));
  1007.            
  1008.             return (int)value;
  1009.         }
  1010.        
  1011.         protected static long DecimalToInt64(decimal value)
  1012.         {
  1013.             if (value < (decimal)Int64.MinValue || value > (decimal)Int64.MaxValue)
  1014.                 throw new OverflowException(Res.GetString(Res.XmlConvert_Overflow, new string[] {XmlConvert.ToString(value), "Int64"}));
  1015.            
  1016.             return (long)value;
  1017.         }
  1018.        
  1019.         protected static ulong DecimalToUInt64(decimal value)
  1020.         {
  1021.             if (value < (decimal)UInt64.MinValue || value > (decimal)UInt64.MaxValue)
  1022.                 throw new OverflowException(Res.GetString(Res.XmlConvert_Overflow, new string[] {XmlConvert.ToString(value), "UInt64"}));
  1023.            
  1024.             return (ulong)value;
  1025.         }
  1026.        
  1027.         protected static byte Int32ToByte(int value)
  1028.         {
  1029.             if (value < (int)Byte.MinValue || value > (int)Byte.MaxValue)
  1030.                 throw new OverflowException(Res.GetString(Res.XmlConvert_Overflow, new string[] {XmlConvert.ToString(value), "Byte"}));
  1031.            
  1032.             return (byte)value;
  1033.         }
  1034.        
  1035.         protected static short Int32ToInt16(int value)
  1036.         {
  1037.             if (value < (int)Int16.MinValue || value > (int)Int16.MaxValue)
  1038.                 throw new OverflowException(Res.GetString(Res.XmlConvert_Overflow, new string[] {XmlConvert.ToString(value), "Int16"}));
  1039.            
  1040.             return (short)value;
  1041.         }
  1042.        
  1043.         protected static sbyte Int32ToSByte(int value)
  1044.         {
  1045.             if (value < (int)SByte.MinValue || value > (int)SByte.MaxValue)
  1046.                 throw new OverflowException(Res.GetString(Res.XmlConvert_Overflow, new string[] {XmlConvert.ToString(value), "SByte"}));
  1047.            
  1048.             return (sbyte)value;
  1049.         }
  1050.        
  1051.         protected static ushort Int32ToUInt16(int value)
  1052.         {
  1053.             if (value < (int)UInt16.MinValue || value > (int)UInt16.MaxValue)
  1054.                 throw new OverflowException(Res.GetString(Res.XmlConvert_Overflow, new string[] {XmlConvert.ToString(value), "UInt16"}));
  1055.            
  1056.             return (ushort)value;
  1057.         }
  1058.        
  1059.         protected static int Int64ToInt32(long value)
  1060.         {
  1061.             if (value < (long)Int32.MinValue || value > (long)Int32.MaxValue)
  1062.                 throw new OverflowException(Res.GetString(Res.XmlConvert_Overflow, new string[] {XmlConvert.ToString(value), "Int32"}));
  1063.            
  1064.             return (int)value;
  1065.         }
  1066.        
  1067.         protected static uint Int64ToUInt32(long value)
  1068.         {
  1069.             if (value < (long)UInt32.MinValue || value > (long)UInt32.MaxValue)
  1070.                 throw new OverflowException(Res.GetString(Res.XmlConvert_Overflow, new string[] {XmlConvert.ToString(value), "UInt32"}));
  1071.            
  1072.             return (uint)value;
  1073.         }
  1074.        
  1075.         protected static DateTime UntypedAtomicToDateTime(string value)
  1076.         {
  1077.             return (DateTime)(new XsdDateTime(value, XsdDateTimeFlags.AllXsd));
  1078.         }
  1079.     }
  1080.    
  1081.     internal class XmlNumeric10Converter : XmlBaseConverter
  1082.     {
  1083.         protected XmlNumeric10Converter(XmlSchemaType schemaType) : base(schemaType)
  1084.         {
  1085.         }
  1086.        
  1087.         public static XmlValueConverter Create(XmlSchemaType schemaType)
  1088.         {
  1089.             return new XmlNumeric10Converter(schemaType);
  1090.         }
  1091.        
  1092.         #region AUTOGENERATED_XMLNUMERIC10CONVERTER
  1093.        
  1094.         //-----------------------------------------------
  1095.         // ToBoolean
  1096.         //-----------------------------------------------
  1097.        
  1098.         // This converter does not support conversions to Boolean.
  1099.        
  1100.        
  1101.         //-----------------------------------------------
  1102.         // ToDateTime
  1103.         //-----------------------------------------------
  1104.        
  1105.         // This converter does not support conversions to DateTime.
  1106.        
  1107.        
  1108.         //-----------------------------------------------
  1109.         // ToDecimal
  1110.         //-----------------------------------------------
  1111.        
  1112.         public override decimal ToDecimal(decimal value)
  1113.         {
  1114.             return ((decimal)value);
  1115.         }
  1116.         public override decimal ToDecimal(int value)
  1117.         {
  1118.             return ((decimal)(int)value);
  1119.         }
  1120.         public override decimal ToDecimal(long value)
  1121.         {
  1122.             return ((decimal)(long)value);
  1123.         }
  1124.         public override decimal ToDecimal(string value)
  1125.         {
  1126.             if (value == null)
  1127.                 throw new ArgumentNullException("value");
  1128.            
  1129.             if (TypeCode == XmlTypeCode.Decimal)
  1130.                 return XmlConvert.ToDecimal((string)value);
  1131.             return XmlConvert.ToInteger((string)value);
  1132.         }
  1133.         public override decimal ToDecimal(object value)
  1134.         {
  1135.             if (value == null)
  1136.                 throw new ArgumentNullException("value");
  1137.            
  1138.             Type sourceType = value.GetType();
  1139.            
  1140.             if (sourceType == DecimalType)
  1141.                 return ((decimal)value);
  1142.             if (sourceType == Int32Type)
  1143.                 return ((decimal)(int)value);
  1144.             if (sourceType == Int64Type)
  1145.                 return ((decimal)(long)value);
  1146.             if (sourceType == StringType)
  1147.                 return this.ToDecimal((string)value);
  1148.             if (sourceType == XmlAtomicValueType)
  1149.                 return ((decimal)((XmlAtomicValue)value).ValueAs(DecimalType));
  1150.            
  1151.             return (decimal)ChangeTypeWildcardDestination(value, DecimalType, null);
  1152.         }
  1153.        
  1154.        
  1155.         //-----------------------------------------------
  1156.         // ToDouble
  1157.         //-----------------------------------------------
  1158.        
  1159.         // This converter does not support conversions to Double.
  1160.        
  1161.        
  1162.         //-----------------------------------------------
  1163.         // ToInt32
  1164.         //-----------------------------------------------
  1165.        
  1166.         public override int ToInt32(decimal value)
  1167.         {
  1168.             return DecimalToInt32((decimal)value);
  1169.         }
  1170.         public override int ToInt32(int value)
  1171.         {
  1172.             return ((int)value);
  1173.         }
  1174.         public override int ToInt32(long value)
  1175.         {
  1176.             return Int64ToInt32((long)value);
  1177.         }
  1178.         public override int ToInt32(string value)
  1179.         {
  1180.             if (value == null)
  1181.                 throw new ArgumentNullException("value");
  1182.            
  1183.             if (TypeCode == XmlTypeCode.Decimal)
  1184.                 return DecimalToInt32(XmlConvert.ToDecimal((string)value));
  1185.             return XmlConvert.ToInt32((string)value);
  1186.         }
  1187.         public override int ToInt32(object value)
  1188.         {
  1189.             if (value == null)
  1190.                 throw new ArgumentNullException("value");
  1191.            
  1192.             Type sourceType = value.GetType();
  1193.            
  1194.             if (sourceType == DecimalType)
  1195.                 return DecimalToInt32((decimal)value);
  1196.             if (sourceType == Int32Type)
  1197.                 return ((int)value);
  1198.             if (sourceType == Int64Type)
  1199.                 return Int64ToInt32((long)value);
  1200.             if (sourceType == StringType)
  1201.                 return this.ToInt32((string)value);
  1202.             if (sourceType == XmlAtomicValueType)
  1203.                 return ((XmlAtomicValue)value).ValueAsInt;
  1204.            
  1205.             return (int)ChangeTypeWildcardDestination(value, Int32Type, null);
  1206.         }
  1207.        
  1208.        
  1209.         //-----------------------------------------------
  1210.         // ToInt64
  1211.         //-----------------------------------------------
  1212.        
  1213.         public override long ToInt64(decimal value)
  1214.         {
  1215.             return DecimalToInt64((decimal)value);
  1216.         }
  1217.         public override long ToInt64(int value)
  1218.         {
  1219.             return ((long)(int)value);
  1220.         }
  1221.         public override long ToInt64(long value)
  1222.         {
  1223.             return ((long)value);
  1224.         }
  1225.         public override long ToInt64(string value)
  1226.         {
  1227.             if (value == null)
  1228.                 throw new ArgumentNullException("value");
  1229.            
  1230.             if (TypeCode == XmlTypeCode.Decimal)
  1231.                 return DecimalToInt64(XmlConvert.ToDecimal((string)value));
  1232.             return XmlConvert.ToInt64((string)value);
  1233.         }
  1234.         public override long ToInt64(object value)
  1235.         {
  1236.             if (value == null)
  1237.                 throw new ArgumentNullException("value");
  1238.            
  1239.             Type sourceType = value.GetType();
  1240.            
  1241.             if (sourceType == DecimalType)
  1242.                 return DecimalToInt64((decimal)value);
  1243.             if (sourceType == Int32Type)
  1244.                 return ((long)(int)value);
  1245.             if (sourceType == Int64Type)
  1246.                 return ((long)value);
  1247.             if (sourceType == StringType)
  1248.                 return this.ToInt64((string)value);
  1249.             if (sourceType == XmlAtomicValueType)
  1250.                 return ((XmlAtomicValue)value).ValueAsLong;
  1251.            
  1252.             return (long)ChangeTypeWildcardDestination(value, Int64Type, null);
  1253.         }
  1254.        
  1255.        
  1256.         //-----------------------------------------------
  1257.         // ToSingle
  1258.         //-----------------------------------------------
  1259.        
  1260.         // This converter does not support conversions to Single.
  1261.        
  1262.        
  1263.         //-----------------------------------------------
  1264.         // ToString
  1265.         //-----------------------------------------------
  1266.        
  1267.         public override string ToString(decimal value)
  1268.         {
  1269.             if (TypeCode == XmlTypeCode.Decimal)
  1270.                 return XmlConvert.ToString((decimal)value);
  1271.             return XmlConvert.ToString(decimal.Truncate((decimal)value));
  1272.         }
  1273.         public override string ToString(int value)
  1274.         {
  1275.             return XmlConvert.ToString((int)value);
  1276.         }
  1277.         public override string ToString(long value)
  1278.         {
  1279.             return XmlConvert.ToString((long)value);
  1280.         }
  1281.         public override string ToString(string value, IXmlNamespaceResolver nsResolver)
  1282.         {
  1283.             if (value == null)
  1284.                 throw new ArgumentNullException("value");
  1285.            
  1286.             return ((string)value);
  1287.         }
  1288.         public override string ToString(object value, IXmlNamespaceResolver nsResolver)
  1289.         {
  1290.             if (value == null)
  1291.                 throw new ArgumentNullException("value");
  1292.            
  1293.             Type sourceType = value.GetType();
  1294.            
  1295.             if (sourceType == DecimalType)
  1296.                 return this.ToString((decimal)value);
  1297.             if (sourceType == Int32Type)
  1298.                 return XmlConvert.ToString((int)value);
  1299.             if (sourceType == Int64Type)
  1300.                 return XmlConvert.ToString((long)value);
  1301.             if (sourceType == StringType)
  1302.                 return ((string)value);
  1303.             if (sourceType == XmlAtomicValueType)
  1304.                 return ((XmlAtomicValue)value).Value;
  1305.            
  1306.             return (string)ChangeTypeWildcardDestination(value, StringType, nsResolver);
  1307.         }
  1308.        
  1309.        
  1310.         //-----------------------------------------------
  1311.         // ChangeType
  1312.         //-----------------------------------------------
  1313.        
  1314.         public override object ChangeType(decimal value, Type destinationType)
  1315.         {
  1316.             if (destinationType == null)
  1317.                 throw new ArgumentNullException("destinationType");
  1318.            
  1319.             if (destinationType == ObjectType)
  1320.                 destinationType = DefaultClrType;
  1321.             if (destinationType == DecimalType)
  1322.                 return ((decimal)value);
  1323.             if (destinationType == Int32Type)
  1324.                 return DecimalToInt32((decimal)value);
  1325.             if (destinationType == Int64Type)
  1326.                 return DecimalToInt64((decimal)value);
  1327.             if (destinationType == StringType)
  1328.                 return this.ToString((decimal)value);
  1329.             if (destinationType == XmlAtomicValueType)
  1330.                 return (new XmlAtomicValue(SchemaType, value));
  1331.             if (destinationType == XPathItemType)
  1332.                 return (new XmlAtomicValue(SchemaType, value));
  1333.            
  1334.             return ChangeTypeWildcardSource(value, destinationType, null);
  1335.         }
  1336.        
  1337.         public override object ChangeType(int value, Type destinationType)
  1338.         {
  1339.             if (destinationType == null)
  1340.                 throw new ArgumentNullException("destinationType");
  1341.            
  1342.             if (destinationType == ObjectType)
  1343.                 destinationType = DefaultClrType;
  1344.             if (destinationType == DecimalType)
  1345.                 return ((decimal)(int)value);
  1346.             if (destinationType == Int32Type)
  1347.                 return ((int)value);
  1348.             if (destinationType == Int64Type)
  1349.                 return ((long)(int)value);
  1350.             if (destinationType == StringType)
  1351.                 return XmlConvert.ToString((int)value);
  1352.             if (destinationType == XmlAtomicValueType)
  1353.                 return (new XmlAtomicValue(SchemaType, (int)value));
  1354.             if (destinationType == XPathItemType)
  1355.                 return (new XmlAtomicValue(SchemaType, (int)value));
  1356.            
  1357.             return ChangeTypeWildcardSource(value, destinationType, null);
  1358.         }
  1359.        
  1360.         public override object ChangeType(long value, Type destinationType)
  1361.         {
  1362.             if (destinationType == null)
  1363.                 throw new ArgumentNullException("destinationType");
  1364.            
  1365.             if (destinationType == ObjectType)
  1366.                 destinationType = DefaultClrType;
  1367.             if (destinationType == DecimalType)
  1368.                 return ((decimal)(long)value);
  1369.             if (destinationType == Int32Type)
  1370.                 return Int64ToInt32((long)value);
  1371.             if (destinationType == Int64Type)
  1372.                 return ((long)value);
  1373.             if (destinationType == StringType)
  1374.                 return XmlConvert.ToString((long)value);
  1375.             if (destinationType == XmlAtomicValueType)
  1376.                 return (new XmlAtomicValue(SchemaType, (long)value));
  1377.             if (destinationType == XPathItemType)
  1378.                 return (new XmlAtomicValue(SchemaType, (long)value));
  1379.            
  1380.             return ChangeTypeWildcardSource(value, destinationType, null);
  1381.         }
  1382.        
  1383.         public override object ChangeType(string value, Type destinationType, IXmlNamespaceResolver nsResolver)
  1384.         {
  1385.             if (value == null)
  1386.                 throw new ArgumentNullException("value");
  1387.             if (destinationType == null)
  1388.                 throw new ArgumentNullException("destinationType");
  1389.            
  1390.             if (destinationType == ObjectType)
  1391.                 destinationType = DefaultClrType;
  1392.             if (destinationType == DecimalType)
  1393.                 return this.ToDecimal((string)value);
  1394.             if (destinationType == Int32Type)
  1395.                 return this.ToInt32((string)value);
  1396.             if (destinationType == Int64Type)
  1397.                 return this.ToInt64((string)value);
  1398.             if (destinationType == StringType)
  1399.                 return ((string)value);
  1400.             if (destinationType == XmlAtomicValueType)
  1401.                 return (new XmlAtomicValue(SchemaType, (string)value));
  1402.             if (destinationType == XPathItemType)
  1403.                 return (new XmlAtomicValue(SchemaType, (string)value));
  1404.            
  1405.             return ChangeTypeWildcardSource(value, destinationType, nsResolver);
  1406.         }
  1407.        
  1408.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  1409.         {
  1410.             if (value == null)
  1411.                 throw new ArgumentNullException("value");
  1412.             if (destinationType == null)
  1413.                 throw new ArgumentNullException("destinationType");
  1414.            
  1415.             Type sourceType = value.GetType();
  1416.            
  1417.             if (destinationType == ObjectType)
  1418.                 destinationType = DefaultClrType;
  1419.             if (destinationType == DecimalType)
  1420.                 return this.ToDecimal(value);
  1421.             if (destinationType == Int32Type)
  1422.                 return this.ToInt32(value);
  1423.             if (destinationType == Int64Type)
  1424.                 return this.ToInt64(value);
  1425.             if (destinationType == StringType)
  1426.                 return this.ToString(value, nsResolver);
  1427.             if (destinationType == XmlAtomicValueType) {
  1428.                 if (sourceType == DecimalType)
  1429.                     return (new XmlAtomicValue(SchemaType, value));
  1430.                 if (sourceType == Int32Type)
  1431.                     return (new XmlAtomicValue(SchemaType, (int)value));
  1432.                 if (sourceType == Int64Type)
  1433.                     return (new XmlAtomicValue(SchemaType, (long)value));
  1434.                 if (sourceType == StringType)
  1435.                     return (new XmlAtomicValue(SchemaType, (string)value));
  1436.                 if (sourceType == XmlAtomicValueType)
  1437.                     return ((XmlAtomicValue)value);
  1438.             }
  1439.             if (destinationType == XPathItemType) {
  1440.                 if (sourceType == DecimalType)
  1441.                     return (new XmlAtomicValue(SchemaType, value));
  1442.                 if (sourceType == Int32Type)
  1443.                     return (new XmlAtomicValue(SchemaType, (int)value));
  1444.                 if (sourceType == Int64Type)
  1445.                     return (new XmlAtomicValue(SchemaType, (long)value));
  1446.                 if (sourceType == StringType)
  1447.                     return (new XmlAtomicValue(SchemaType, (string)value));
  1448.                 if (sourceType == XmlAtomicValueType)
  1449.                     return ((XmlAtomicValue)value);
  1450.             }
  1451.             if (destinationType == ByteType)
  1452.                 return Int32ToByte(this.ToInt32(value));
  1453.             if (destinationType == Int16Type)
  1454.                 return Int32ToInt16(this.ToInt32(value));
  1455.             if (destinationType == SByteType)
  1456.                 return Int32ToSByte(this.ToInt32(value));
  1457.             if (destinationType == UInt16Type)
  1458.                 return Int32ToUInt16(this.ToInt32(value));
  1459.             if (destinationType == UInt32Type)
  1460.                 return Int64ToUInt32(this.ToInt64(value));
  1461.             if (destinationType == UInt64Type)
  1462.                 return DecimalToUInt64(this.ToDecimal(value));
  1463.             if (sourceType == ByteType)
  1464.                 return this.ChangeType((int)(byte)value, destinationType);
  1465.             if (sourceType == Int16Type)
  1466.                 return this.ChangeType((int)(short)value, destinationType);
  1467.             if (sourceType == SByteType)
  1468.                 return this.ChangeType((int)(sbyte)value, destinationType);
  1469.             if (sourceType == UInt16Type)
  1470.                 return this.ChangeType((int)(ushort)value, destinationType);
  1471.             if (sourceType == UInt32Type)
  1472.                 return this.ChangeType((long)(uint)value, destinationType);
  1473.             if (sourceType == UInt64Type)
  1474.                 return this.ChangeType((decimal)(ulong)value, destinationType);
  1475.            
  1476.             return ChangeListType(value, destinationType, nsResolver);
  1477.         }
  1478.        
  1479.        
  1480.         //-----------------------------------------------
  1481.         // Helpers
  1482.         //-----------------------------------------------
  1483.        
  1484.         private object ChangeTypeWildcardDestination(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  1485.         {
  1486.             Type sourceType = value.GetType();
  1487.            
  1488.             if (sourceType == ByteType)
  1489.                 return this.ChangeType((int)(byte)value, destinationType);
  1490.             if (sourceType == Int16Type)
  1491.                 return this.ChangeType((int)(short)value, destinationType);
  1492.             if (sourceType == SByteType)
  1493.                 return this.ChangeType((int)(sbyte)value, destinationType);
  1494.             if (sourceType == UInt16Type)
  1495.                 return this.ChangeType((int)(ushort)value, destinationType);
  1496.             if (sourceType == UInt32Type)
  1497.                 return this.ChangeType((long)(uint)value, destinationType);
  1498.             if (sourceType == UInt64Type)
  1499.                 return this.ChangeType((decimal)(ulong)value, destinationType);
  1500.            
  1501.             return ChangeListType(value, destinationType, nsResolver);
  1502.         }
  1503.         private object ChangeTypeWildcardSource(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  1504.         {
  1505.             if (destinationType == ByteType)
  1506.                 return Int32ToByte(this.ToInt32(value));
  1507.             if (destinationType == Int16Type)
  1508.                 return Int32ToInt16(this.ToInt32(value));
  1509.             if (destinationType == SByteType)
  1510.                 return Int32ToSByte(this.ToInt32(value));
  1511.             if (destinationType == UInt16Type)
  1512.                 return Int32ToUInt16(this.ToInt32(value));
  1513.             if (destinationType == UInt32Type)
  1514.                 return Int64ToUInt32(this.ToInt64(value));
  1515.             if (destinationType == UInt64Type)
  1516.                 return DecimalToUInt64(this.ToDecimal(value));
  1517.            
  1518.             return ChangeListType(value, destinationType, nsResolver);
  1519.         }
  1520.         #endregion
  1521.     }
  1522.    
  1523.     internal class XmlNumeric2Converter : XmlBaseConverter
  1524.     {
  1525.         protected XmlNumeric2Converter(XmlSchemaType schemaType) : base(schemaType)
  1526.         {
  1527.         }
  1528.        
  1529.         public static XmlValueConverter Create(XmlSchemaType schemaType)
  1530.         {
  1531.             return new XmlNumeric2Converter(schemaType);
  1532.         }
  1533.        
  1534.         #region AUTOGENERATED_XMLNUMERIC2CONVERTER
  1535.        
  1536.         //-----------------------------------------------
  1537.         // ToBoolean
  1538.         //-----------------------------------------------
  1539.        
  1540.         // This converter does not support conversions to Boolean.
  1541.        
  1542.        
  1543.         //-----------------------------------------------
  1544.         // ToDateTime
  1545.         //-----------------------------------------------
  1546.        
  1547.         // This converter does not support conversions to DateTime.
  1548.        
  1549.        
  1550.         //-----------------------------------------------
  1551.         // ToDecimal
  1552.         //-----------------------------------------------
  1553.        
  1554.         // This converter does not support conversions to Decimal.
  1555.        
  1556.        
  1557.         //-----------------------------------------------
  1558.         // ToDouble
  1559.         //-----------------------------------------------
  1560.        
  1561.         public override double ToDouble(double value)
  1562.         {
  1563.             return ((double)value);
  1564.         }
  1565.         public override double ToDouble(float value)
  1566.         {
  1567.             return ((double)(float)value);
  1568.         }
  1569.         public override double ToDouble(string value)
  1570.         {
  1571.             if (value == null)
  1572.                 throw new ArgumentNullException("value");
  1573.            
  1574.             if (TypeCode == XmlTypeCode.Float)
  1575.                 return ((double)XmlConvert.ToSingle((string)value));
  1576.             return XmlConvert.ToDouble((string)value);
  1577.         }
  1578.         public override double ToDouble(object value)
  1579.         {
  1580.             if (value == null)
  1581.                 throw new ArgumentNullException("value");
  1582.            
  1583.             Type sourceType = value.GetType();
  1584.            
  1585.             if (sourceType == DoubleType)
  1586.                 return ((double)value);
  1587.             if (sourceType == SingleType)
  1588.                 return ((double)(float)value);
  1589.             if (sourceType == StringType)
  1590.                 return this.ToDouble((string)value);
  1591.             if (sourceType == XmlAtomicValueType)
  1592.                 return ((XmlAtomicValue)value).ValueAsDouble;
  1593.            
  1594.             return (double)ChangeListType(value, DoubleType, null);
  1595.         }
  1596.        
  1597.        
  1598.         //-----------------------------------------------
  1599.         // ToInt32
  1600.         //-----------------------------------------------
  1601.        
  1602.         // This converter does not support conversions to Int32.
  1603.        
  1604.        
  1605.         //-----------------------------------------------
  1606.         // ToInt64
  1607.         //-----------------------------------------------
  1608.        
  1609.         // This converter does not support conversions to Int64.
  1610.        
  1611.        
  1612.         //-----------------------------------------------
  1613.         // ToSingle
  1614.         //-----------------------------------------------
  1615.        
  1616.         public override float ToSingle(double value)
  1617.         {
  1618.             return ((float)(double)value);
  1619.         }
  1620.         public override float ToSingle(float value)
  1621.         {
  1622.             return ((float)value);
  1623.         }
  1624.         public override float ToSingle(string value)
  1625.         {
  1626.             if (value == null)
  1627.                 throw new ArgumentNullException("value");
  1628.            
  1629.             if (TypeCode == XmlTypeCode.Float)
  1630.                 return XmlConvert.ToSingle((string)value);
  1631.             return ((float)XmlConvert.ToDouble((string)value));
  1632.         }
  1633.         public override float ToSingle(object value)
  1634.         {
  1635.             if (value == null)
  1636.                 throw new ArgumentNullException("value");
  1637.            
  1638.             Type sourceType = value.GetType();
  1639.            
  1640.             if (sourceType == DoubleType)
  1641.                 return ((float)(double)value);
  1642.             if (sourceType == SingleType)
  1643.                 return ((float)value);
  1644.             if (sourceType == StringType)
  1645.                 return this.ToSingle((string)value);
  1646.             if (sourceType == XmlAtomicValueType)
  1647.                 return ((float)((XmlAtomicValue)value).ValueAs(SingleType));
  1648.            
  1649.             return (float)ChangeListType(value, SingleType, null);
  1650.         }
  1651.        
  1652.        
  1653.         //-----------------------------------------------
  1654.         // ToString
  1655.         //-----------------------------------------------
  1656.        
  1657.         public override string ToString(double value)
  1658.         {
  1659.             if (TypeCode == XmlTypeCode.Float)
  1660.                 return XmlConvert.ToString(ToSingle((double)value));
  1661.             return XmlConvert.ToString((double)value);
  1662.         }
  1663.         public override string ToString(float value)
  1664.         {
  1665.             if (TypeCode == XmlTypeCode.Float)
  1666.                 return XmlConvert.ToString((float)value);
  1667.             return XmlConvert.ToString((double)(float)value);
  1668.         }
  1669.         public override string ToString(string value, IXmlNamespaceResolver nsResolver)
  1670.         {
  1671.             if (value == null)
  1672.                 throw new ArgumentNullException("value");
  1673.            
  1674.             return ((string)value);
  1675.         }
  1676.         public override string ToString(object value, IXmlNamespaceResolver nsResolver)
  1677.         {
  1678.             if (value == null)
  1679.                 throw new ArgumentNullException("value");
  1680.            
  1681.             Type sourceType = value.GetType();
  1682.            
  1683.             if (sourceType == DoubleType)
  1684.                 return this.ToString((double)value);
  1685.             if (sourceType == SingleType)
  1686.                 return this.ToString((float)value);
  1687.             if (sourceType == StringType)
  1688.                 return ((string)value);
  1689.             if (sourceType == XmlAtomicValueType)
  1690.                 return ((XmlAtomicValue)value).Value;
  1691.            
  1692.             return (string)ChangeListType(value, StringType, nsResolver);
  1693.         }
  1694.        
  1695.        
  1696.         //-----------------------------------------------
  1697.         // ChangeType
  1698.         //-----------------------------------------------
  1699.        
  1700.         public override object ChangeType(double value, Type destinationType)
  1701.         {
  1702.             if (destinationType == null)
  1703.                 throw new ArgumentNullException("destinationType");
  1704.            
  1705.             if (destinationType == ObjectType)
  1706.                 destinationType = DefaultClrType;
  1707.             if (destinationType == DoubleType)
  1708.                 return ((double)value);
  1709.             if (destinationType == SingleType)
  1710.                 return ((float)(double)value);
  1711.             if (destinationType == StringType)
  1712.                 return this.ToString((double)value);
  1713.             if (destinationType == XmlAtomicValueType)
  1714.                 return (new XmlAtomicValue(SchemaType, (double)value));
  1715.             if (destinationType == XPathItemType)
  1716.                 return (new XmlAtomicValue(SchemaType, (double)value));
  1717.            
  1718.             return ChangeListType(value, destinationType, null);
  1719.         }
  1720.        
  1721.         public override object ChangeType(float value, Type destinationType)
  1722.         {
  1723.             if (destinationType == null)
  1724.                 throw new ArgumentNullException("destinationType");
  1725.            
  1726.             if (destinationType == ObjectType)
  1727.                 destinationType = DefaultClrType;
  1728.             if (destinationType == DoubleType)
  1729.                 return ((double)(float)value);
  1730.             if (destinationType == SingleType)
  1731.                 return ((float)value);
  1732.             if (destinationType == StringType)
  1733.                 return this.ToString((float)value);
  1734.             if (destinationType == XmlAtomicValueType)
  1735.                 return (new XmlAtomicValue(SchemaType, value));
  1736.             if (destinationType == XPathItemType)
  1737.                 return (new XmlAtomicValue(SchemaType, value));
  1738.            
  1739.             return ChangeListType(value, destinationType, null);
  1740.         }
  1741.        
  1742.         public override object ChangeType(string value, Type destinationType, IXmlNamespaceResolver nsResolver)
  1743.         {
  1744.             if (value == null)
  1745.                 throw new ArgumentNullException("value");
  1746.             if (destinationType == null)
  1747.                 throw new ArgumentNullException("destinationType");
  1748.            
  1749.             if (destinationType == ObjectType)
  1750.                 destinationType = DefaultClrType;
  1751.             if (destinationType == DoubleType)
  1752.                 return this.ToDouble((string)value);
  1753.             if (destinationType == SingleType)
  1754.                 return this.ToSingle((string)value);
  1755.             if (destinationType == StringType)
  1756.                 return ((string)value);
  1757.             if (destinationType == XmlAtomicValueType)
  1758.                 return (new XmlAtomicValue(SchemaType, (string)value));
  1759.             if (destinationType == XPathItemType)
  1760.                 return (new XmlAtomicValue(SchemaType, (string)value));
  1761.            
  1762.             return ChangeListType(value, destinationType, nsResolver);
  1763.         }
  1764.        
  1765.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  1766.         {
  1767.             if (value == null)
  1768.                 throw new ArgumentNullException("value");
  1769.             if (destinationType == null)
  1770.                 throw new ArgumentNullException("destinationType");
  1771.            
  1772.             Type sourceType = value.GetType();
  1773.            
  1774.             if (destinationType == ObjectType)
  1775.                 destinationType = DefaultClrType;
  1776.             if (destinationType == DoubleType)
  1777.                 return this.ToDouble(value);
  1778.             if (destinationType == SingleType)
  1779.                 return this.ToSingle(value);
  1780.             if (destinationType == StringType)
  1781.                 return this.ToString(value, nsResolver);
  1782.             if (destinationType == XmlAtomicValueType) {
  1783.                 if (sourceType == DoubleType)
  1784.                     return (new XmlAtomicValue(SchemaType, (double)value));
  1785.                 if (sourceType == SingleType)
  1786.                     return (new XmlAtomicValue(SchemaType, value));
  1787.                 if (sourceType == StringType)
  1788.                     return (new XmlAtomicValue(SchemaType, (string)value));
  1789.                 if (sourceType == XmlAtomicValueType)
  1790.                     return ((XmlAtomicValue)value);
  1791.             }
  1792.             if (destinationType == XPathItemType) {
  1793.                 if (sourceType == DoubleType)
  1794.                     return (new XmlAtomicValue(SchemaType, (double)value));
  1795.                 if (sourceType == SingleType)
  1796.                     return (new XmlAtomicValue(SchemaType, value));
  1797.                 if (sourceType == StringType)
  1798.                     return (new XmlAtomicValue(SchemaType, (string)value));
  1799.                 if (sourceType == XmlAtomicValueType)
  1800.                     return ((XmlAtomicValue)value);
  1801.             }
  1802.            
  1803.             return ChangeListType(value, destinationType, nsResolver);
  1804.         }
  1805.         #endregion
  1806.     }
  1807.    
  1808.     internal class XmlDateTimeConverter : XmlBaseConverter
  1809.     {
  1810.         protected XmlDateTimeConverter(XmlSchemaType schemaType) : base(schemaType)
  1811.         {
  1812.         }
  1813.        
  1814.         public static XmlValueConverter Create(XmlSchemaType schemaType)
  1815.         {
  1816.             return new XmlDateTimeConverter(schemaType);
  1817.         }
  1818.        
  1819.         #region AUTOGENERATED_XMLDATETIMECONVERTER
  1820.        
  1821.         //-----------------------------------------------
  1822.         // ToBoolean
  1823.         //-----------------------------------------------
  1824.        
  1825.         // This converter does not support conversions to Boolean.
  1826.        
  1827.        
  1828.         //-----------------------------------------------
  1829.         // ToDateTime
  1830.         //-----------------------------------------------
  1831.        
  1832.         public override DateTime ToDateTime(DateTime value)
  1833.         {
  1834.             return ((DateTime)value);
  1835.         }
  1836.         public override DateTime ToDateTime(string value)
  1837.         {
  1838.             if (value == null)
  1839.                 throw new ArgumentNullException("value");
  1840.            
  1841.             switch (TypeCode) {
  1842.                 case XmlTypeCode.Date:
  1843.                     return StringToDate((string)value);
  1844.                 case XmlTypeCode.Time:
  1845.                     return StringToTime((string)value);
  1846.                 case XmlTypeCode.GDay:
  1847.                     return StringToGDay((string)value);
  1848.                 case XmlTypeCode.GMonth:
  1849.                     return StringToGMonth((string)value);
  1850.                 case XmlTypeCode.GMonthDay:
  1851.                     return StringToGMonthDay((string)value);
  1852.                 case XmlTypeCode.GYear:
  1853.                     return StringToGYear((string)value);
  1854.                 case XmlTypeCode.GYearMonth:
  1855.                     return StringToGYearMonth((string)value);
  1856.             }
  1857.             return StringToDateTime((string)value);
  1858.         }
  1859.         public override DateTime ToDateTime(object value)
  1860.         {
  1861.             if (value == null)
  1862.                 throw new ArgumentNullException("value");
  1863.            
  1864.             Type sourceType = value.GetType();
  1865.            
  1866.             if (sourceType == DateTimeType)
  1867.                 return ((DateTime)value);
  1868.             if (sourceType == StringType)
  1869.                 return this.ToDateTime((string)value);
  1870.             if (sourceType == XmlAtomicValueType)
  1871.                 return ((XmlAtomicValue)value).ValueAsDateTime;
  1872.            
  1873.             return (DateTime)ChangeListType(value, DateTimeType, null);
  1874.         }
  1875.        
  1876.        
  1877.         //-----------------------------------------------
  1878.         // ToDecimal
  1879.         //-----------------------------------------------
  1880.        
  1881.         // This converter does not support conversions to Decimal.
  1882.        
  1883.        
  1884.         //-----------------------------------------------
  1885.         // ToDouble
  1886.         //-----------------------------------------------
  1887.        
  1888.         // This converter does not support conversions to Double.
  1889.        
  1890.        
  1891.         //-----------------------------------------------
  1892.         // ToInt32
  1893.         //-----------------------------------------------
  1894.        
  1895.         // This converter does not support conversions to Int32.
  1896.        
  1897.        
  1898.         //-----------------------------------------------
  1899.         // ToInt64
  1900.         //-----------------------------------------------
  1901.        
  1902.         // This converter does not support conversions to Int64.
  1903.        
  1904.        
  1905.         //-----------------------------------------------
  1906.         // ToSingle
  1907.         //-----------------------------------------------
  1908.        
  1909.         // This converter does not support conversions to Single.
  1910.        
  1911.        
  1912.         //-----------------------------------------------
  1913.         // ToString
  1914.         //-----------------------------------------------
  1915.        
  1916.         public override string ToString(DateTime value)
  1917.         {
  1918.             switch (TypeCode) {
  1919.                 case XmlTypeCode.Date:
  1920.                     return DateToString((DateTime)value);
  1921.                 case XmlTypeCode.Time:
  1922.                     return TimeToString((DateTime)value);
  1923.                 case XmlTypeCode.GDay:
  1924.                     return GDayToString((DateTime)value);
  1925.                 case XmlTypeCode.GMonth:
  1926.                     return GMonthToString((DateTime)value);
  1927.                 case XmlTypeCode.GMonthDay:
  1928.                     return GMonthDayToString((DateTime)value);
  1929.                 case XmlTypeCode.GYear:
  1930.                     return GYearToString((DateTime)value);
  1931.                 case XmlTypeCode.GYearMonth:
  1932.                     return GYearMonthToString((DateTime)value);
  1933.             }
  1934.             return DateTimeToString((DateTime)value);
  1935.         }
  1936.         public override string ToString(string value, IXmlNamespaceResolver nsResolver)
  1937.         {
  1938.             if (value == null)
  1939.                 throw new ArgumentNullException("value");
  1940.            
  1941.             return ((string)value);
  1942.         }
  1943.         public override string ToString(object value, IXmlNamespaceResolver nsResolver)
  1944.         {
  1945.             if (value == null)
  1946.                 throw new ArgumentNullException("value");
  1947.            
  1948.             Type sourceType = value.GetType();
  1949.            
  1950.             if (sourceType == DateTimeType)
  1951.                 return this.ToString((DateTime)value);
  1952.             if (sourceType == StringType)
  1953.                 return ((string)value);
  1954.             if (sourceType == XmlAtomicValueType)
  1955.                 return ((XmlAtomicValue)value).Value;
  1956.            
  1957.             return (string)ChangeListType(value, StringType, nsResolver);
  1958.         }
  1959.        
  1960.        
  1961.         //-----------------------------------------------
  1962.         // ChangeType
  1963.         //-----------------------------------------------
  1964.        
  1965.         public override object ChangeType(DateTime value, Type destinationType)
  1966.         {
  1967.             if (destinationType == null)
  1968.                 throw new ArgumentNullException("destinationType");
  1969.            
  1970.             if (destinationType == ObjectType)
  1971.                 destinationType = DefaultClrType;
  1972.             if (destinationType == DateTimeType)
  1973.                 return ((DateTime)value);
  1974.             if (destinationType == StringType)
  1975.                 return this.ToString((DateTime)value);
  1976.             if (destinationType == XmlAtomicValueType)
  1977.                 return (new XmlAtomicValue(SchemaType, (DateTime)value));
  1978.             if (destinationType == XPathItemType)
  1979.                 return (new XmlAtomicValue(SchemaType, (DateTime)value));
  1980.            
  1981.             return ChangeListType(value, destinationType, null);
  1982.         }
  1983.        
  1984.         public override object ChangeType(string value, Type destinationType, IXmlNamespaceResolver nsResolver)
  1985.         {
  1986.             if (value == null)
  1987.                 throw new ArgumentNullException("value");
  1988.             if (destinationType == null)
  1989.                 throw new ArgumentNullException("destinationType");
  1990.            
  1991.             if (destinationType == ObjectType)
  1992.                 destinationType = DefaultClrType;
  1993.             if (destinationType == DateTimeType)
  1994.                 return this.ToDateTime((string)value);
  1995.             if (destinationType == StringType)
  1996.                 return ((string)value);
  1997.             if (destinationType == XmlAtomicValueType)
  1998.                 return (new XmlAtomicValue(SchemaType, (string)value));
  1999.             if (destinationType == XPathItemType)
  2000.                 return (new XmlAtomicValue(SchemaType, (string)value));
  2001.            
  2002.             return ChangeListType(value, destinationType, nsResolver);
  2003.         }
  2004.        
  2005.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  2006.         {
  2007.             if (value == null)
  2008.                 throw new ArgumentNullException("value");
  2009.             if (destinationType == null)
  2010.                 throw new ArgumentNullException("destinationType");
  2011.            
  2012.             Type sourceType = value.GetType();
  2013.            
  2014.             if (destinationType == ObjectType)
  2015.                 destinationType = DefaultClrType;
  2016.             if (destinationType == DateTimeType)
  2017.                 return this.ToDateTime(value);
  2018.             if (destinationType == StringType)
  2019.                 return this.ToString(value, nsResolver);
  2020.             if (destinationType == XmlAtomicValueType) {
  2021.                 if (sourceType == DateTimeType)
  2022.                     return (new XmlAtomicValue(SchemaType, (DateTime)value));
  2023.                 if (sourceType == StringType)
  2024.                     return (new XmlAtomicValue(SchemaType, (string)value));
  2025.                 if (sourceType == XmlAtomicValueType)
  2026.                     return ((XmlAtomicValue)value);
  2027.             }
  2028.             if (destinationType == XPathItemType) {
  2029.                 if (sourceType == DateTimeType)
  2030.                     return (new XmlAtomicValue(SchemaType, (DateTime)value));
  2031.                 if (sourceType == StringType)
  2032.                     return (new XmlAtomicValue(SchemaType, (string)value));
  2033.                 if (sourceType == XmlAtomicValueType)
  2034.                     return ((XmlAtomicValue)value);
  2035.             }
  2036.            
  2037.             return ChangeListType(value, destinationType, nsResolver);
  2038.         }
  2039.         #endregion
  2040.     }
  2041.    
  2042.     internal class XmlBooleanConverter : XmlBaseConverter
  2043.     {
  2044.         protected XmlBooleanConverter(XmlSchemaType schemaType) : base(schemaType)
  2045.         {
  2046.         }
  2047.        
  2048.         public static XmlValueConverter Create(XmlSchemaType schemaType)
  2049.         {
  2050.             return new XmlBooleanConverter(schemaType);
  2051.         }
  2052.        
  2053.         #region AUTOGENERATED_XMLBOOLEANCONVERTER
  2054.        
  2055.         //-----------------------------------------------
  2056.         // ToBoolean
  2057.         //-----------------------------------------------
  2058.        
  2059.         public override bool ToBoolean(bool value)
  2060.         {
  2061.             return ((bool)value);
  2062.         }
  2063.         public override bool ToBoolean(string value)
  2064.         {
  2065.             if (value == null)
  2066.                 throw new ArgumentNullException("value");
  2067.            
  2068.             return XmlConvert.ToBoolean((string)value);
  2069.         }
  2070.         public override bool ToBoolean(object value)
  2071.         {
  2072.             if (value == null)
  2073.                 throw new ArgumentNullException("value");
  2074.            
  2075.             Type sourceType = value.GetType();
  2076.            
  2077.             if (sourceType == BooleanType)
  2078.                 return ((bool)value);
  2079.             if (sourceType == StringType)
  2080.                 return XmlConvert.ToBoolean((string)value);
  2081.             if (sourceType == XmlAtomicValueType)
  2082.                 return ((XmlAtomicValue)value).ValueAsBoolean;
  2083.            
  2084.             return (bool)ChangeListType(value, BooleanType, null);
  2085.         }
  2086.        
  2087.        
  2088.         //-----------------------------------------------
  2089.         // ToDateTime
  2090.         //-----------------------------------------------
  2091.        
  2092.         // This converter does not support conversions to DateTime.
  2093.        
  2094.        
  2095.         //-----------------------------------------------
  2096.         // ToDecimal
  2097.         //-----------------------------------------------
  2098.        
  2099.         // This converter does not support conversions to Decimal.
  2100.        
  2101.        
  2102.         //-----------------------------------------------
  2103.         // ToDouble
  2104.         //-----------------------------------------------
  2105.        
  2106.         // This converter does not support conversions to Double.
  2107.        
  2108.        
  2109.         //-----------------------------------------------
  2110.         // ToInt32
  2111.         //-----------------------------------------------
  2112.        
  2113.         // This converter does not support conversions to Int32.
  2114.        
  2115.        
  2116.         //-----------------------------------------------
  2117.         // ToInt64
  2118.         //-----------------------------------------------
  2119.        
  2120.         // This converter does not support conversions to Int64.
  2121.        
  2122.        
  2123.         //-----------------------------------------------
  2124.         // ToSingle
  2125.         //-----------------------------------------------
  2126.        
  2127.         // This converter does not support conversions to Single.
  2128.        
  2129.        
  2130.         //-----------------------------------------------
  2131.         // ToString
  2132.         //-----------------------------------------------
  2133.        
  2134.         public override string ToString(bool value)
  2135.         {
  2136.             return XmlConvert.ToString((bool)value);
  2137.         }
  2138.         public override string ToString(string value, IXmlNamespaceResolver nsResolver)
  2139.         {
  2140.             if (value == null)
  2141.                 throw new ArgumentNullException("value");
  2142.            
  2143.             return ((string)value);
  2144.         }
  2145.         public override string ToString(object value, IXmlNamespaceResolver nsResolver)
  2146.         {
  2147.             if (value == null)
  2148.                 throw new ArgumentNullException("value");
  2149.            
  2150.             Type sourceType = value.GetType();
  2151.            
  2152.             if (sourceType == BooleanType)
  2153.                 return XmlConvert.ToString((bool)value);
  2154.             if (sourceType == StringType)
  2155.                 return ((string)value);
  2156.             if (sourceType == XmlAtomicValueType)
  2157.                 return ((XmlAtomicValue)value).Value;
  2158.            
  2159.             return (string)ChangeListType(value, StringType, nsResolver);
  2160.         }
  2161.        
  2162.        
  2163.         //-----------------------------------------------
  2164.         // ChangeType
  2165.         //-----------------------------------------------
  2166.        
  2167.         public override object ChangeType(bool value, Type destinationType)
  2168.         {
  2169.             if (destinationType == null)
  2170.                 throw new ArgumentNullException("destinationType");
  2171.            
  2172.             if (destinationType == ObjectType)
  2173.                 destinationType = DefaultClrType;
  2174.             if (destinationType == BooleanType)
  2175.                 return ((bool)value);
  2176.             if (destinationType == StringType)
  2177.                 return XmlConvert.ToString((bool)value);
  2178.             if (destinationType == XmlAtomicValueType)
  2179.                 return (new XmlAtomicValue(SchemaType, (bool)value));
  2180.             if (destinationType == XPathItemType)
  2181.                 return (new XmlAtomicValue(SchemaType, (bool)value));
  2182.            
  2183.             return ChangeListType(value, destinationType, null);
  2184.         }
  2185.        
  2186.         public override object ChangeType(string value, Type destinationType, IXmlNamespaceResolver nsResolver)
  2187.         {
  2188.             if (value == null)
  2189.                 throw new ArgumentNullException("value");
  2190.             if (destinationType == null)
  2191.                 throw new ArgumentNullException("destinationType");
  2192.            
  2193.             if (destinationType == ObjectType)
  2194.                 destinationType = DefaultClrType;
  2195.             if (destinationType == BooleanType)
  2196.                 return XmlConvert.ToBoolean((string)value);
  2197.             if (destinationType == StringType)
  2198.                 return ((string)value);
  2199.             if (destinationType == XmlAtomicValueType)
  2200.                 return (new XmlAtomicValue(SchemaType, (string)value));
  2201.             if (destinationType == XPathItemType)
  2202.                 return (new XmlAtomicValue(SchemaType, (string)value));
  2203.            
  2204.             return ChangeListType(value, destinationType, nsResolver);
  2205.         }
  2206.        
  2207.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  2208.         {
  2209.             if (value == null)
  2210.                 throw new ArgumentNullException("value");
  2211.             if (destinationType == null)
  2212.                 throw new ArgumentNullException("destinationType");
  2213.            
  2214.             Type sourceType = value.GetType();
  2215.            
  2216.             if (destinationType == ObjectType)
  2217.                 destinationType = DefaultClrType;
  2218.             if (destinationType == BooleanType)
  2219.                 return this.ToBoolean(value);
  2220.             if (destinationType == StringType)
  2221.                 return this.ToString(value, nsResolver);
  2222.             if (destinationType == XmlAtomicValueType) {
  2223.                 if (sourceType == BooleanType)
  2224.                     return (new XmlAtomicValue(SchemaType, (bool)value));
  2225.                 if (sourceType == StringType)
  2226.                     return (new XmlAtomicValue(SchemaType, (string)value));
  2227.                 if (sourceType == XmlAtomicValueType)
  2228.                     return ((XmlAtomicValue)value);
  2229.             }
  2230.             if (destinationType == XPathItemType) {
  2231.                 if (sourceType == BooleanType)
  2232.                     return (new XmlAtomicValue(SchemaType, (bool)value));
  2233.                 if (sourceType == StringType)
  2234.                     return (new XmlAtomicValue(SchemaType, (string)value));
  2235.                 if (sourceType == XmlAtomicValueType)
  2236.                     return ((XmlAtomicValue)value);
  2237.             }
  2238.            
  2239.             return ChangeListType(value, destinationType, nsResolver);
  2240.         }
  2241.         #endregion
  2242.     }
  2243.    
  2244.     internal class XmlMiscConverter : XmlBaseConverter
  2245.     {
  2246.         protected XmlMiscConverter(XmlSchemaType schemaType) : base(schemaType)
  2247.         {
  2248.         }
  2249.        
  2250.         public static XmlValueConverter Create(XmlSchemaType schemaType)
  2251.         {
  2252.             return new XmlMiscConverter(schemaType);
  2253.         }
  2254.        
  2255.         #region AUTOGENERATED_XMLMISCCONVERTER
  2256.        
  2257.         //-----------------------------------------------
  2258.         // ToBoolean
  2259.         //-----------------------------------------------
  2260.        
  2261.         // This converter does not support conversions to Boolean.
  2262.        
  2263.        
  2264.         //-----------------------------------------------
  2265.         // ToDateTime
  2266.         //-----------------------------------------------
  2267.        
  2268.         // This converter does not support conversions to DateTime.
  2269.        
  2270.        
  2271.         //-----------------------------------------------
  2272.         // ToDecimal
  2273.         //-----------------------------------------------
  2274.        
  2275.         // This converter does not support conversions to Decimal.
  2276.        
  2277.        
  2278.         //-----------------------------------------------
  2279.         // ToDouble
  2280.         //-----------------------------------------------
  2281.        
  2282.         // This converter does not support conversions to Double.
  2283.        
  2284.        
  2285.         //-----------------------------------------------
  2286.         // ToInt32
  2287.         //-----------------------------------------------
  2288.        
  2289.         // This converter does not support conversions to Int32.
  2290.        
  2291.        
  2292.         //-----------------------------------------------
  2293.         // ToInt64
  2294.         //-----------------------------------------------
  2295.        
  2296.         // This converter does not support conversions to Int64.
  2297.        
  2298.        
  2299.         //-----------------------------------------------
  2300.         // ToSingle
  2301.         //-----------------------------------------------
  2302.        
  2303.         // This converter does not support conversions to Single.
  2304.        
  2305.        
  2306.         //-----------------------------------------------
  2307.         // ToString
  2308.         //-----------------------------------------------
  2309.        
  2310.         public override string ToString(string value, IXmlNamespaceResolver nsResolver)
  2311.         {
  2312.             if (value == null)
  2313.                 throw new ArgumentNullException("value");
  2314.            
  2315.             return (string)value;
  2316.         }
  2317.         public override string ToString(object value, IXmlNamespaceResolver nsResolver)
  2318.         {
  2319.             if (value == null)
  2320.                 throw new ArgumentNullException("value");
  2321.            
  2322.             Type sourceType = value.GetType();
  2323.            
  2324.             if (sourceType == ByteArrayType) {
  2325.                 switch (TypeCode) {
  2326.                     case XmlTypeCode.Base64Binary:
  2327.                         return Base64BinaryToString((byte[])value);
  2328.                     case XmlTypeCode.HexBinary:
  2329.                         return XmlConvert.ToBinHexString((byte[])value);
  2330.                 }
  2331.             }
  2332.             if (sourceType == StringType)
  2333.                 return (string)value;
  2334.             if (IsDerivedFrom(sourceType, UriType))
  2335.                 if (TypeCode == XmlTypeCode.AnyUri)
  2336.                     return AnyUriToString((Uri)value);
  2337.             if (sourceType == TimeSpanType) {
  2338.                 switch (TypeCode) {
  2339.                     case XmlTypeCode.DayTimeDuration:
  2340.                         return DayTimeDurationToString((TimeSpan)value);
  2341.                     case XmlTypeCode.Duration:
  2342.                         return DurationToString((TimeSpan)value);
  2343.                     case XmlTypeCode.YearMonthDuration:
  2344.                         return YearMonthDurationToString((TimeSpan)value);
  2345.                 }
  2346.             }
  2347.             if (IsDerivedFrom(sourceType, XmlQualifiedNameType)) {
  2348.                 switch (TypeCode) {
  2349.                     case XmlTypeCode.Notation:
  2350.                         return QNameToString((XmlQualifiedName)value, nsResolver);
  2351.                     case XmlTypeCode.QName:
  2352.                         return QNameToString((XmlQualifiedName)value, nsResolver);
  2353.                 }
  2354.             }
  2355.            
  2356.             return (string)ChangeTypeWildcardDestination(value, StringType, nsResolver);
  2357.         }
  2358.        
  2359.        
  2360.         //-----------------------------------------------
  2361.         // ChangeType
  2362.         //-----------------------------------------------
  2363.        
  2364.         public override object ChangeType(string value, Type destinationType, IXmlNamespaceResolver nsResolver)
  2365.         {
  2366.             if (value == null)
  2367.                 throw new ArgumentNullException("value");
  2368.             if (destinationType == null)
  2369.                 throw new ArgumentNullException("destinationType");
  2370.            
  2371.             if (destinationType == ObjectType)
  2372.                 destinationType = DefaultClrType;
  2373.             if (destinationType == ByteArrayType) {
  2374.                 switch (TypeCode) {
  2375.                     case XmlTypeCode.Base64Binary:
  2376.                         return StringToBase64Binary((string)value);
  2377.                     case XmlTypeCode.HexBinary:
  2378.                         return StringToHexBinary((string)value);
  2379.                 }
  2380.             }
  2381.             if (destinationType == XmlQualifiedNameType) {
  2382.                 switch (TypeCode) {
  2383.                     case XmlTypeCode.Notation:
  2384.                         return StringToQName((string)value, nsResolver);
  2385.                     case XmlTypeCode.QName:
  2386.                         return StringToQName((string)value, nsResolver);
  2387.                 }
  2388.             }
  2389.             if (destinationType == StringType)
  2390.                 return (string)value;
  2391.             if (destinationType == TimeSpanType) {
  2392.                 switch (TypeCode) {
  2393.                     case XmlTypeCode.DayTimeDuration:
  2394.                         return StringToDayTimeDuration((string)value);
  2395.                     case XmlTypeCode.Duration:
  2396.                         return StringToDuration((string)value);
  2397.                     case XmlTypeCode.YearMonthDuration:
  2398.                         return StringToYearMonthDuration((string)value);
  2399.                 }
  2400.             }
  2401.             if (destinationType == UriType)
  2402.                 if (TypeCode == XmlTypeCode.AnyUri)
  2403.                     return XmlConvert.ToUri((string)value);
  2404.             if (destinationType == XmlAtomicValueType)
  2405.                 return (new XmlAtomicValue(SchemaType, (string)value, nsResolver));
  2406.            
  2407.             return ChangeTypeWildcardSource(value, destinationType, nsResolver);
  2408.         }
  2409.        
  2410.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  2411.         {
  2412.             if (value == null)
  2413.                 throw new ArgumentNullException("value");
  2414.             if (destinationType == null)
  2415.                 throw new ArgumentNullException("destinationType");
  2416.            
  2417.             Type sourceType = value.GetType();
  2418.            
  2419.             if (destinationType == ObjectType)
  2420.                 destinationType = DefaultClrType;
  2421.             if (destinationType == ByteArrayType) {
  2422.                 if (sourceType == ByteArrayType) {
  2423.                     switch (TypeCode) {
  2424.                         case XmlTypeCode.Base64Binary:
  2425.                             return ((byte[])value);
  2426.                         case XmlTypeCode.HexBinary:
  2427.                             return ((byte[])value);
  2428.                     }
  2429.                 }
  2430.                 if (sourceType == StringType) {
  2431.                     switch (TypeCode) {
  2432.                         case XmlTypeCode.Base64Binary:
  2433.                             return StringToBase64Binary((string)value);
  2434.                         case XmlTypeCode.HexBinary:
  2435.                             return StringToHexBinary((string)value);
  2436.                     }
  2437.                 }
  2438.             }
  2439.             if (destinationType == XmlQualifiedNameType) {
  2440.                 if (sourceType == StringType) {
  2441.                     switch (TypeCode) {
  2442.                         case XmlTypeCode.Notation:
  2443.                             return StringToQName((string)value, nsResolver);
  2444.                         case XmlTypeCode.QName:
  2445.                             return StringToQName((string)value, nsResolver);
  2446.                     }
  2447.                 }
  2448.                 if (IsDerivedFrom(sourceType, XmlQualifiedNameType)) {
  2449.                     switch (TypeCode) {
  2450.                         case XmlTypeCode.Notation:
  2451.                             return ((XmlQualifiedName)value);
  2452.                         case XmlTypeCode.QName:
  2453.                             return ((XmlQualifiedName)value);
  2454.                     }
  2455.                 }
  2456.             }
  2457.             if (destinationType == StringType)
  2458.                 return this.ToString(value, nsResolver);
  2459.             if (destinationType == TimeSpanType) {
  2460.                 if (sourceType == StringType) {
  2461.                     switch (TypeCode) {
  2462.                         case XmlTypeCode.DayTimeDuration:
  2463.                             return StringToDayTimeDuration((string)value);
  2464.                         case XmlTypeCode.Duration:
  2465.                             return StringToDuration((string)value);
  2466.                         case XmlTypeCode.YearMonthDuration:
  2467.                             return StringToYearMonthDuration((string)value);
  2468.                     }
  2469.                 }
  2470.                 if (sourceType == TimeSpanType) {
  2471.                     switch (TypeCode) {
  2472.                         case XmlTypeCode.DayTimeDuration:
  2473.                             return ((TimeSpan)value);
  2474.                         case XmlTypeCode.Duration:
  2475.                             return ((TimeSpan)value);
  2476.                         case XmlTypeCode.YearMonthDuration:
  2477.                             return ((TimeSpan)value);
  2478.                     }
  2479.                 }
  2480.             }
  2481.             if (destinationType == UriType) {
  2482.                 if (sourceType == StringType)
  2483.                     if (TypeCode == XmlTypeCode.AnyUri)
  2484.                         return XmlConvert.ToUri((string)value);
  2485.                 if (IsDerivedFrom(sourceType, UriType))
  2486.                     if (TypeCode == XmlTypeCode.AnyUri)
  2487.                         return ((Uri)value);
  2488.             }
  2489.             if (destinationType == XmlAtomicValueType) {
  2490.                 if (sourceType == ByteArrayType) {
  2491.                     switch (TypeCode) {
  2492.                         case XmlTypeCode.Base64Binary:
  2493.                             return (new XmlAtomicValue(SchemaType, value));
  2494.                         case XmlTypeCode.HexBinary:
  2495.                             return (new XmlAtomicValue(SchemaType, value));
  2496.                     }
  2497.                 }
  2498.                 if (sourceType == StringType)
  2499.                     return (new XmlAtomicValue(SchemaType, (string)value, nsResolver));
  2500.                 if (sourceType == TimeSpanType) {
  2501.                     switch (TypeCode) {
  2502.                         case XmlTypeCode.DayTimeDuration:
  2503.                             return (new XmlAtomicValue(SchemaType, value));
  2504.                         case XmlTypeCode.Duration:
  2505.                             return (new XmlAtomicValue(SchemaType, value));
  2506.                         case XmlTypeCode.YearMonthDuration:
  2507.                             return (new XmlAtomicValue(SchemaType, value));
  2508.                     }
  2509.                 }
  2510.                 if (IsDerivedFrom(sourceType, UriType))
  2511.                     if (TypeCode == XmlTypeCode.AnyUri)
  2512.                         return (new XmlAtomicValue(SchemaType, value));
  2513.                 if (sourceType == XmlAtomicValueType)
  2514.                     return ((XmlAtomicValue)value);
  2515.                 if (IsDerivedFrom(sourceType, XmlQualifiedNameType)) {
  2516.                     switch (TypeCode) {
  2517.                         case XmlTypeCode.Notation:
  2518.                             return (new XmlAtomicValue(SchemaType, value, nsResolver));
  2519.                         case XmlTypeCode.QName:
  2520.                             return (new XmlAtomicValue(SchemaType, value, nsResolver));
  2521.                     }
  2522.                 }
  2523.             }
  2524.             if (destinationType == XPathItemType) {
  2525.                 if (sourceType == XmlAtomicValueType)
  2526.                     return ((XmlAtomicValue)value);
  2527.             }
  2528.             if (destinationType == XPathItemType)
  2529.                 return ((XPathItem)this.ChangeType(value, XmlAtomicValueType, nsResolver));
  2530.             if (sourceType == XmlAtomicValueType)
  2531.                 return ((XmlAtomicValue)value).ValueAs(destinationType, nsResolver);
  2532.            
  2533.             return ChangeListType(value, destinationType, nsResolver);
  2534.         }
  2535.        
  2536.        
  2537.         //-----------------------------------------------
  2538.         // Helpers
  2539.         //-----------------------------------------------
  2540.        
  2541.         private object ChangeTypeWildcardDestination(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  2542.         {
  2543.             Type sourceType = value.GetType();
  2544.            
  2545.             if (sourceType == XmlAtomicValueType)
  2546.                 return ((XmlAtomicValue)value).ValueAs(destinationType, nsResolver);
  2547.            
  2548.             return ChangeListType(value, destinationType, nsResolver);
  2549.         }
  2550.         private object ChangeTypeWildcardSource(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  2551.         {
  2552.             if (destinationType == XPathItemType)
  2553.                 return ((XPathItem)this.ChangeType(value, XmlAtomicValueType, nsResolver));
  2554.            
  2555.             return ChangeListType(value, destinationType, nsResolver);
  2556.         }
  2557.         #endregion
  2558.     }
  2559.    
  2560.     internal class XmlStringConverter : XmlBaseConverter
  2561.     {
  2562.         protected XmlStringConverter(XmlSchemaType schemaType) : base(schemaType)
  2563.         {
  2564.         }
  2565.        
  2566.         public static XmlValueConverter Create(XmlSchemaType schemaType)
  2567.         {
  2568.             return new XmlStringConverter(schemaType);
  2569.         }
  2570.        
  2571.         #region AUTOGENERATED_XMLSTRINGCONVERTER
  2572.        
  2573.         //-----------------------------------------------
  2574.         // ToBoolean
  2575.         //-----------------------------------------------
  2576.        
  2577.         // This converter does not support conversions to Boolean.
  2578.        
  2579.        
  2580.         //-----------------------------------------------
  2581.         // ToDateTime
  2582.         //-----------------------------------------------
  2583.        
  2584.         // This converter does not support conversions to DateTime.
  2585.        
  2586.        
  2587.         //-----------------------------------------------
  2588.         // ToDecimal
  2589.         //-----------------------------------------------
  2590.        
  2591.         // This converter does not support conversions to Decimal.
  2592.        
  2593.        
  2594.         //-----------------------------------------------
  2595.         // ToDouble
  2596.         //-----------------------------------------------
  2597.        
  2598.         // This converter does not support conversions to Double.
  2599.        
  2600.        
  2601.         //-----------------------------------------------
  2602.         // ToInt32
  2603.         //-----------------------------------------------
  2604.        
  2605.         // This converter does not support conversions to Int32.
  2606.        
  2607.        
  2608.         //-----------------------------------------------
  2609.         // ToInt64
  2610.         //-----------------------------------------------
  2611.        
  2612.         // This converter does not support conversions to Int64.
  2613.        
  2614.        
  2615.         //-----------------------------------------------
  2616.         // ToSingle
  2617.         //-----------------------------------------------
  2618.        
  2619.         // This converter does not support conversions to Single.
  2620.        
  2621.        
  2622.         //-----------------------------------------------
  2623.         // ToString
  2624.         //-----------------------------------------------
  2625.        
  2626.         public override string ToString(string value, IXmlNamespaceResolver nsResolver)
  2627.         {
  2628.             if (value == null)
  2629.                 throw new ArgumentNullException("value");
  2630.            
  2631.             return ((string)value);
  2632.         }
  2633.         public override string ToString(object value, IXmlNamespaceResolver nsResolver)
  2634.         {
  2635.             if (value == null)
  2636.                 throw new ArgumentNullException("value");
  2637.            
  2638.             Type sourceType = value.GetType();
  2639.            
  2640.             if (sourceType == StringType)
  2641.                 return ((string)value);
  2642.             if (sourceType == XmlAtomicValueType)
  2643.                 return ((XmlAtomicValue)value).Value;
  2644.            
  2645.             return (string)ChangeListType(value, StringType, nsResolver);
  2646.         }
  2647.        
  2648.        
  2649.         //-----------------------------------------------
  2650.         // ChangeType
  2651.         //-----------------------------------------------
  2652.        
  2653.         public override object ChangeType(string value, Type destinationType, IXmlNamespaceResolver nsResolver)
  2654.         {
  2655.             if (value == null)
  2656.                 throw new ArgumentNullException("value");
  2657.             if (destinationType == null)
  2658.                 throw new ArgumentNullException("destinationType");
  2659.            
  2660.             if (destinationType == ObjectType)
  2661.                 destinationType = DefaultClrType;
  2662.             if (destinationType == StringType)
  2663.                 return ((string)value);
  2664.             if (destinationType == XmlAtomicValueType)
  2665.                 return (new XmlAtomicValue(SchemaType, (string)value));
  2666.             if (destinationType == XPathItemType)
  2667.                 return (new XmlAtomicValue(SchemaType, (string)value));
  2668.            
  2669.             return ChangeListType(value, destinationType, nsResolver);
  2670.         }
  2671.        
  2672.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  2673.         {
  2674.             if (value == null)
  2675.                 throw new ArgumentNullException("value");
  2676.             if (destinationType == null)
  2677.                 throw new ArgumentNullException("destinationType");
  2678.            
  2679.             Type sourceType = value.GetType();
  2680.            
  2681.             if (destinationType == ObjectType)
  2682.                 destinationType = DefaultClrType;
  2683.             if (destinationType == StringType)
  2684.                 return this.ToString(value, nsResolver);
  2685.             if (destinationType == XmlAtomicValueType) {
  2686.                 if (sourceType == StringType)
  2687.                     return (new XmlAtomicValue(SchemaType, (string)value));
  2688.                 if (sourceType == XmlAtomicValueType)
  2689.                     return ((XmlAtomicValue)value);
  2690.             }
  2691.             if (destinationType == XPathItemType) {
  2692.                 if (sourceType == StringType)
  2693.                     return (new XmlAtomicValue(SchemaType, (string)value));
  2694.                 if (sourceType == XmlAtomicValueType)
  2695.                     return ((XmlAtomicValue)value);
  2696.             }
  2697.            
  2698.             return ChangeListType(value, destinationType, nsResolver);
  2699.         }
  2700.         #endregion
  2701.     }
  2702.    
  2703.     internal class XmlUntypedConverter : XmlListConverter
  2704.     {
  2705.         private bool allowListToList;
  2706.        
  2707.         protected XmlUntypedConverter() : base(DatatypeImplementation.UntypedAtomicType)
  2708.         {
  2709.         }
  2710.        
  2711.         protected XmlUntypedConverter(XmlUntypedConverter atomicConverter, bool allowListToList) : base(atomicConverter, allowListToList ? StringArrayType : StringType)
  2712.         {
  2713.             this.allowListToList = allowListToList;
  2714.         }
  2715.        
  2716.         public static readonly XmlValueConverter Untyped = new XmlUntypedConverter(new XmlUntypedConverter(), false);
  2717.         public static readonly XmlValueConverter UntypedList = new XmlUntypedConverter(new XmlUntypedConverter(), true);
  2718.        
  2719.         #region AUTOGENERATED_XMLUNTYPEDCONVERTER
  2720.        
  2721.         //-----------------------------------------------
  2722.         // ToBoolean
  2723.         //-----------------------------------------------
  2724.        
  2725.         public override bool ToBoolean(string value)
  2726.         {
  2727.             if (value == null)
  2728.                 throw new ArgumentNullException("value");
  2729.            
  2730.             return XmlConvert.ToBoolean((string)value);
  2731.         }
  2732.         public override bool ToBoolean(object value)
  2733.         {
  2734.             if (value == null)
  2735.                 throw new ArgumentNullException("value");
  2736.            
  2737.             Type sourceType = value.GetType();
  2738.            
  2739.             if (sourceType == StringType)
  2740.                 return XmlConvert.ToBoolean((string)value);
  2741.            
  2742.             return (bool)ChangeTypeWildcardDestination(value, BooleanType, null);
  2743.         }
  2744.        
  2745.        
  2746.         //-----------------------------------------------
  2747.         // ToDateTime
  2748.         //-----------------------------------------------
  2749.        
  2750.         public override DateTime ToDateTime(string value)
  2751.         {
  2752.             if (value == null)
  2753.                 throw new ArgumentNullException("value");
  2754.            
  2755.             return UntypedAtomicToDateTime((string)value);
  2756.         }
  2757.         public override DateTime ToDateTime(object value)
  2758.         {
  2759.             if (value == null)
  2760.                 throw new ArgumentNullException("value");
  2761.            
  2762.             Type sourceType = value.GetType();
  2763.            
  2764.             if (sourceType == StringType)
  2765.                 return UntypedAtomicToDateTime((string)value);
  2766.            
  2767.             return (DateTime)ChangeTypeWildcardDestination(value, DateTimeType, null);
  2768.         }
  2769.        
  2770.        
  2771.         //-----------------------------------------------
  2772.         // ToDecimal
  2773.         //-----------------------------------------------
  2774.        
  2775.         public override decimal ToDecimal(string value)
  2776.         {
  2777.             if (value == null)
  2778.                 throw new ArgumentNullException("value");
  2779.            
  2780.             return XmlConvert.ToDecimal((string)value);
  2781.         }
  2782.         public override decimal ToDecimal(object value)
  2783.         {
  2784.             if (value == null)
  2785.                 throw new ArgumentNullException("value");
  2786.            
  2787.             Type sourceType = value.GetType();
  2788.            
  2789.             if (sourceType == StringType)
  2790.                 return XmlConvert.ToDecimal((string)value);
  2791.            
  2792.             return (decimal)ChangeTypeWildcardDestination(value, DecimalType, null);
  2793.         }
  2794.        
  2795.        
  2796.         //-----------------------------------------------
  2797.         // ToDouble
  2798.         //-----------------------------------------------
  2799.        
  2800.         public override double ToDouble(string value)
  2801.         {
  2802.             if (value == null)
  2803.                 throw new ArgumentNullException("value");
  2804.            
  2805.             return XmlConvert.ToDouble((string)value);
  2806.         }
  2807.         public override double ToDouble(object value)
  2808.         {
  2809.             if (value == null)
  2810.                 throw new ArgumentNullException("value");
  2811.            
  2812.             Type sourceType = value.GetType();
  2813.            
  2814.             if (sourceType == StringType)
  2815.                 return XmlConvert.ToDouble((string)value);
  2816.            
  2817.             return (double)ChangeTypeWildcardDestination(value, DoubleType, null);
  2818.         }
  2819.        
  2820.        
  2821.         //-----------------------------------------------
  2822.         // ToInt32
  2823.         //-----------------------------------------------
  2824.        
  2825.         public override int ToInt32(string value)
  2826.         {
  2827.             if (value == null)
  2828.                 throw new ArgumentNullException("value");
  2829.            
  2830.             return XmlConvert.ToInt32((string)value);
  2831.         }
  2832.         public override int ToInt32(object value)
  2833.         {
  2834.             if (value == null)
  2835.                 throw new ArgumentNullException("value");
  2836.            
  2837.             Type sourceType = value.GetType();
  2838.            
  2839.             if (sourceType == StringType)
  2840.                 return XmlConvert.ToInt32((string)value);
  2841.            
  2842.             return (int)ChangeTypeWildcardDestination(value, Int32Type, null);
  2843.         }
  2844.        
  2845.        
  2846.         //-----------------------------------------------
  2847.         // ToInt64
  2848.         //-----------------------------------------------
  2849.        
  2850.         public override long ToInt64(string value)
  2851.         {
  2852.             if (value == null)
  2853.                 throw new ArgumentNullException("value");
  2854.            
  2855.             return XmlConvert.ToInt64((string)value);
  2856.         }
  2857.         public override long ToInt64(object value)
  2858.         {
  2859.             if (value == null)
  2860.                 throw new ArgumentNullException("value");
  2861.            
  2862.             Type sourceType = value.GetType();
  2863.            
  2864.             if (sourceType == StringType)
  2865.                 return XmlConvert.ToInt64((string)value);
  2866.            
  2867.             return (long)ChangeTypeWildcardDestination(value, Int64Type, null);
  2868.         }
  2869.        
  2870.        
  2871.         //-----------------------------------------------
  2872.         // ToSingle
  2873.         //-----------------------------------------------
  2874.        
  2875.         public override float ToSingle(string value)
  2876.         {
  2877.             if (value == null)
  2878.                 throw new ArgumentNullException("value");
  2879.            
  2880.             return XmlConvert.ToSingle((string)value);
  2881.         }
  2882.         public override float ToSingle(object value)
  2883.         {
  2884.             if (value == null)
  2885.                 throw new ArgumentNullException("value");
  2886.            
  2887.             Type sourceType = value.GetType();
  2888.            
  2889.             if (sourceType == StringType)
  2890.                 return XmlConvert.ToSingle((string)value);
  2891.            
  2892.             return (float)ChangeTypeWildcardDestination(value, SingleType, null);
  2893.         }
  2894.        
  2895.        
  2896.         //-----------------------------------------------
  2897.         // ToString
  2898.         //-----------------------------------------------
  2899.        
  2900.         public override string ToString(bool value)
  2901.         {
  2902.             return XmlConvert.ToString((bool)value);
  2903.         }
  2904.         public override string ToString(DateTime value)
  2905.         {
  2906.             return DateTimeToString((DateTime)value);
  2907.         }
  2908.         public override string ToString(decimal value)
  2909.         {
  2910.             return XmlConvert.ToString((decimal)value);
  2911.         }
  2912.         public override string ToString(double value)
  2913.         {
  2914.             return XmlConvert.ToString((double)value);
  2915.         }
  2916.         public override string ToString(int value)
  2917.         {
  2918.             return XmlConvert.ToString((int)value);
  2919.         }
  2920.         public override string ToString(long value)
  2921.         {
  2922.             return XmlConvert.ToString((long)value);
  2923.         }
  2924.         public override string ToString(float value)
  2925.         {
  2926.             return XmlConvert.ToString((float)value);
  2927.         }
  2928.         public override string ToString(string value, IXmlNamespaceResolver nsResolver)
  2929.         {
  2930.             if (value == null)
  2931.                 throw new ArgumentNullException("value");
  2932.            
  2933.             return ((string)value);
  2934.         }
  2935.         public override string ToString(object value, IXmlNamespaceResolver nsResolver)
  2936.         {
  2937.             if (value == null)
  2938.                 throw new ArgumentNullException("value");
  2939.            
  2940.             Type sourceType = value.GetType();
  2941.            
  2942.             if (sourceType == BooleanType)
  2943.                 return XmlConvert.ToString((bool)value);
  2944.             if (sourceType == ByteType)
  2945.                 return XmlConvert.ToString((byte)value);
  2946.             if (sourceType == ByteArrayType)
  2947.                 return Base64BinaryToString((byte[])value);
  2948.             if (sourceType == DateTimeType)
  2949.                 return DateTimeToString((DateTime)value);
  2950.             if (sourceType == DecimalType)
  2951.                 return XmlConvert.ToString((decimal)value);
  2952.             if (sourceType == DoubleType)
  2953.                 return XmlConvert.ToString((double)value);
  2954.             if (sourceType == Int16Type)
  2955.                 return XmlConvert.ToString((short)value);
  2956.             if (sourceType == Int32Type)
  2957.                 return XmlConvert.ToString((int)value);
  2958.             if (sourceType == Int64Type)
  2959.                 return XmlConvert.ToString((long)value);
  2960.             if (sourceType == SByteType)
  2961.                 return XmlConvert.ToString((sbyte)value);
  2962.             if (sourceType == SingleType)
  2963.                 return XmlConvert.ToString((float)value);
  2964.             if (sourceType == StringType)
  2965.                 return ((string)value);
  2966.             if (sourceType == TimeSpanType)
  2967.                 return DurationToString((TimeSpan)value);
  2968.             if (sourceType == UInt16Type)
  2969.                 return XmlConvert.ToString((ushort)value);
  2970.             if (sourceType == UInt32Type)
  2971.                 return XmlConvert.ToString((uint)value);
  2972.             if (sourceType == UInt64Type)
  2973.                 return XmlConvert.ToString((ulong)value);
  2974.             if (IsDerivedFrom(sourceType, UriType))
  2975.                 return AnyUriToString((Uri)value);
  2976.             if (sourceType == XmlAtomicValueType)
  2977.                 return ((string)((XmlAtomicValue)value).ValueAs(StringType, nsResolver));
  2978.             if (IsDerivedFrom(sourceType, XmlQualifiedNameType))
  2979.                 return QNameToString((XmlQualifiedName)value, nsResolver);
  2980.            
  2981.             return (string)ChangeTypeWildcardDestination(value, StringType, nsResolver);
  2982.         }
  2983.        
  2984.        
  2985.         //-----------------------------------------------
  2986.         // ChangeType
  2987.         //-----------------------------------------------
  2988.        
  2989.         public override object ChangeType(bool value, Type destinationType)
  2990.         {
  2991.             if (destinationType == null)
  2992.                 throw new ArgumentNullException("destinationType");
  2993.            
  2994.             if (destinationType == ObjectType)
  2995.                 destinationType = DefaultClrType;
  2996.             if (destinationType == StringType)
  2997.                 return XmlConvert.ToString((bool)value);
  2998.            
  2999.             return ChangeTypeWildcardSource(value, destinationType, null);
  3000.         }
  3001.        
  3002.         public override object ChangeType(DateTime value, Type destinationType)
  3003.         {
  3004.             if (destinationType == null)
  3005.                 throw new ArgumentNullException("destinationType");
  3006.            
  3007.             if (destinationType == ObjectType)
  3008.                 destinationType = DefaultClrType;
  3009.             if (destinationType == StringType)
  3010.                 return DateTimeToString((DateTime)value);
  3011.            
  3012.             return ChangeTypeWildcardSource(value, destinationType, null);
  3013.         }
  3014.        
  3015.         public override object ChangeType(decimal value, Type destinationType)
  3016.         {
  3017.             if (destinationType == null)
  3018.                 throw new ArgumentNullException("destinationType");
  3019.            
  3020.             if (destinationType == ObjectType)
  3021.                 destinationType = DefaultClrType;
  3022.             if (destinationType == StringType)
  3023.                 return XmlConvert.ToString((decimal)value);
  3024.            
  3025.             return ChangeTypeWildcardSource(value, destinationType, null);
  3026.         }
  3027.        
  3028.         public override object ChangeType(double value, Type destinationType)
  3029.         {
  3030.             if (destinationType == null)
  3031.                 throw new ArgumentNullException("destinationType");
  3032.            
  3033.             if (destinationType == ObjectType)
  3034.                 destinationType = DefaultClrType;
  3035.             if (destinationType == StringType)
  3036.                 return XmlConvert.ToString((double)value);
  3037.            
  3038.             return ChangeTypeWildcardSource(value, destinationType, null);
  3039.         }
  3040.        
  3041.         public override object ChangeType(int value, Type destinationType)
  3042.         {
  3043.             if (destinationType == null)
  3044.                 throw new ArgumentNullException("destinationType");
  3045.            
  3046.             if (destinationType == ObjectType)
  3047.                 destinationType = DefaultClrType;
  3048.             if (destinationType == StringType)
  3049.                 return XmlConvert.ToString((int)value);
  3050.            
  3051.             return ChangeTypeWildcardSource(value, destinationType, null);
  3052.         }
  3053.        
  3054.         public override object ChangeType(long value, Type destinationType)
  3055.         {
  3056.             if (destinationType == null)
  3057.                 throw new ArgumentNullException("destinationType");
  3058.            
  3059.             if (destinationType == ObjectType)
  3060.                 destinationType = DefaultClrType;
  3061.             if (destinationType == StringType)
  3062.                 return XmlConvert.ToString((long)value);
  3063.            
  3064.             return ChangeTypeWildcardSource(value, destinationType, null);
  3065.         }
  3066.        
  3067.         public override object ChangeType(float value, Type destinationType)
  3068.         {
  3069.             if (destinationType == null)
  3070.                 throw new ArgumentNullException("destinationType");
  3071.            
  3072.             if (destinationType == ObjectType)
  3073.                 destinationType = DefaultClrType;
  3074.             if (destinationType == StringType)
  3075.                 return XmlConvert.ToString((float)value);
  3076.            
  3077.             return ChangeTypeWildcardSource(value, destinationType, null);
  3078.         }
  3079.        
  3080.         public override object ChangeType(string value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3081.         {
  3082.             if (value == null)
  3083.                 throw new ArgumentNullException("value");
  3084.             if (destinationType == null)
  3085.                 throw new ArgumentNullException("destinationType");
  3086.            
  3087.             if (destinationType == ObjectType)
  3088.                 destinationType = DefaultClrType;
  3089.             if (destinationType == BooleanType)
  3090.                 return XmlConvert.ToBoolean((string)value);
  3091.             if (destinationType == ByteType)
  3092.                 return Int32ToByte(XmlConvert.ToInt32((string)value));
  3093.             if (destinationType == ByteArrayType)
  3094.                 return StringToBase64Binary((string)value);
  3095.             if (destinationType == DateTimeType)
  3096.                 return UntypedAtomicToDateTime((string)value);
  3097.             if (destinationType == DecimalType)
  3098.                 return XmlConvert.ToDecimal((string)value);
  3099.             if (destinationType == DoubleType)
  3100.                 return XmlConvert.ToDouble((string)value);
  3101.             if (destinationType == Int16Type)
  3102.                 return Int32ToInt16(XmlConvert.ToInt32((string)value));
  3103.             if (destinationType == Int32Type)
  3104.                 return XmlConvert.ToInt32((string)value);
  3105.             if (destinationType == Int64Type)
  3106.                 return XmlConvert.ToInt64((string)value);
  3107.             if (destinationType == SByteType)
  3108.                 return Int32ToSByte(XmlConvert.ToInt32((string)value));
  3109.             if (destinationType == SingleType)
  3110.                 return XmlConvert.ToSingle((string)value);
  3111.             if (destinationType == TimeSpanType)
  3112.                 return StringToDuration((string)value);
  3113.             if (destinationType == UInt16Type)
  3114.                 return Int32ToUInt16(XmlConvert.ToInt32((string)value));
  3115.             if (destinationType == UInt32Type)
  3116.                 return Int64ToUInt32(XmlConvert.ToInt64((string)value));
  3117.             if (destinationType == UInt64Type)
  3118.                 return DecimalToUInt64(XmlConvert.ToDecimal((string)value));
  3119.             if (destinationType == UriType)
  3120.                 return XmlConvert.ToUri((string)value);
  3121.             if (destinationType == XmlAtomicValueType)
  3122.                 return (new XmlAtomicValue(SchemaType, (string)value));
  3123.             if (destinationType == XmlQualifiedNameType)
  3124.                 return StringToQName((string)value, nsResolver);
  3125.             if (destinationType == XPathItemType)
  3126.                 return (new XmlAtomicValue(SchemaType, (string)value));
  3127.             if (destinationType == StringType)
  3128.                 return ((string)value);
  3129.            
  3130.             return ChangeTypeWildcardSource(value, destinationType, nsResolver);
  3131.         }
  3132.        
  3133.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3134.         {
  3135.             if (value == null)
  3136.                 throw new ArgumentNullException("value");
  3137.             if (destinationType == null)
  3138.                 throw new ArgumentNullException("destinationType");
  3139.            
  3140.             Type sourceType = value.GetType();
  3141.            
  3142.             if (destinationType == ObjectType)
  3143.                 destinationType = DefaultClrType;
  3144.             if (destinationType == BooleanType) {
  3145.                 if (sourceType == StringType)
  3146.                     return XmlConvert.ToBoolean((string)value);
  3147.             }
  3148.             if (destinationType == ByteType) {
  3149.                 if (sourceType == StringType)
  3150.                     return Int32ToByte(XmlConvert.ToInt32((string)value));
  3151.             }
  3152.             if (destinationType == ByteArrayType) {
  3153.                 if (sourceType == StringType)
  3154.                     return StringToBase64Binary((string)value);
  3155.             }
  3156.             if (destinationType == DateTimeType) {
  3157.                 if (sourceType == StringType)
  3158.                     return UntypedAtomicToDateTime((string)value);
  3159.             }
  3160.             if (destinationType == DecimalType) {
  3161.                 if (sourceType == StringType)
  3162.                     return XmlConvert.ToDecimal((string)value);
  3163.             }
  3164.             if (destinationType == DoubleType) {
  3165.                 if (sourceType == StringType)
  3166.                     return XmlConvert.ToDouble((string)value);
  3167.             }
  3168.             if (destinationType == Int16Type) {
  3169.                 if (sourceType == StringType)
  3170.                     return Int32ToInt16(XmlConvert.ToInt32((string)value));
  3171.             }
  3172.             if (destinationType == Int32Type) {
  3173.                 if (sourceType == StringType)
  3174.                     return XmlConvert.ToInt32((string)value);
  3175.             }
  3176.             if (destinationType == Int64Type) {
  3177.                 if (sourceType == StringType)
  3178.                     return XmlConvert.ToInt64((string)value);
  3179.             }
  3180.             if (destinationType == SByteType) {
  3181.                 if (sourceType == StringType)
  3182.                     return Int32ToSByte(XmlConvert.ToInt32((string)value));
  3183.             }
  3184.             if (destinationType == SingleType) {
  3185.                 if (sourceType == StringType)
  3186.                     return XmlConvert.ToSingle((string)value);
  3187.             }
  3188.             if (destinationType == TimeSpanType) {
  3189.                 if (sourceType == StringType)
  3190.                     return StringToDuration((string)value);
  3191.             }
  3192.             if (destinationType == UInt16Type) {
  3193.                 if (sourceType == StringType)
  3194.                     return Int32ToUInt16(XmlConvert.ToInt32((string)value));
  3195.             }
  3196.             if (destinationType == UInt32Type) {
  3197.                 if (sourceType == StringType)
  3198.                     return Int64ToUInt32(XmlConvert.ToInt64((string)value));
  3199.             }
  3200.             if (destinationType == UInt64Type) {
  3201.                 if (sourceType == StringType)
  3202.                     return DecimalToUInt64(XmlConvert.ToDecimal((string)value));
  3203.             }
  3204.             if (destinationType == UriType) {
  3205.                 if (sourceType == StringType)
  3206.                     return XmlConvert.ToUri((string)value);
  3207.             }
  3208.             if (destinationType == XmlAtomicValueType) {
  3209.                 if (sourceType == StringType)
  3210.                     return (new XmlAtomicValue(SchemaType, (string)value));
  3211.                 if (sourceType == XmlAtomicValueType)
  3212.                     return ((XmlAtomicValue)value);
  3213.             }
  3214.             if (destinationType == XmlQualifiedNameType) {
  3215.                 if (sourceType == StringType)
  3216.                     return StringToQName((string)value, nsResolver);
  3217.             }
  3218.             if (destinationType == XPathItemType) {
  3219.                 if (sourceType == StringType)
  3220.                     return (new XmlAtomicValue(SchemaType, (string)value));
  3221.                 if (sourceType == XmlAtomicValueType)
  3222.                     return ((XmlAtomicValue)value);
  3223.             }
  3224.             if (destinationType == StringType)
  3225.                 return this.ToString(value, nsResolver);
  3226.             if (destinationType == XmlAtomicValueType)
  3227.                 return (new XmlAtomicValue(SchemaType, this.ToString(value, nsResolver)));
  3228.             if (destinationType == XPathItemType)
  3229.                 return (new XmlAtomicValue(SchemaType, this.ToString(value, nsResolver)));
  3230.             if (sourceType == XmlAtomicValueType)
  3231.                 return ((XmlAtomicValue)value).ValueAs(destinationType, nsResolver);
  3232.            
  3233.             return ChangeListType(value, destinationType, nsResolver);
  3234.         }
  3235.        
  3236.        
  3237.         //-----------------------------------------------
  3238.         // Helpers
  3239.         //-----------------------------------------------
  3240.        
  3241.         private object ChangeTypeWildcardDestination(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3242.         {
  3243.             Type sourceType = value.GetType();
  3244.            
  3245.             if (sourceType == XmlAtomicValueType)
  3246.                 return ((XmlAtomicValue)value).ValueAs(destinationType, nsResolver);
  3247.            
  3248.             return ChangeListType(value, destinationType, nsResolver);
  3249.         }
  3250.         private object ChangeTypeWildcardSource(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3251.         {
  3252.             if (destinationType == XmlAtomicValueType)
  3253.                 return (new XmlAtomicValue(SchemaType, this.ToString(value, nsResolver)));
  3254.             if (destinationType == XPathItemType)
  3255.                 return (new XmlAtomicValue(SchemaType, this.ToString(value, nsResolver)));
  3256.            
  3257.             return ChangeListType(value, destinationType, nsResolver);
  3258.         }
  3259.         #endregion
  3260.        
  3261.        
  3262.         //-----------------------------------------------
  3263.         // Helpers
  3264.         //-----------------------------------------------
  3265.        
  3266.         protected override object ChangeListType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3267.         {
  3268.             Type sourceType = value.GetType();
  3269.            
  3270.             // 1. If there is no nested atomic converter, then do not support lists at all
  3271.             // 2. If list to list conversions are not allowed, only allow string => list and list => string
  3272.             if ((this.atomicConverter == null) || (!this.allowListToList && sourceType != StringType && destinationType != StringType)) {
  3273.                 if (SupportsType(sourceType))
  3274.                     throw new InvalidCastException(Res.GetString(Res.XmlConvert_TypeToString, XmlTypeName, sourceType.Name));
  3275.                
  3276.                 if (SupportsType(destinationType))
  3277.                     throw new InvalidCastException(Res.GetString(Res.XmlConvert_TypeFromString, XmlTypeName, destinationType.Name));
  3278.                
  3279.                 throw CreateInvalidClrMappingException(sourceType, destinationType);
  3280.             }
  3281.            
  3282.             return base.ChangeListType(value, destinationType, nsResolver);
  3283.         }
  3284.        
  3285.         private bool SupportsType(Type clrType)
  3286.         {
  3287.             if (clrType == BooleanType)
  3288.                 return true;
  3289.             if (clrType == ByteType)
  3290.                 return true;
  3291.             if (clrType == ByteArrayType)
  3292.                 return true;
  3293.             if (clrType == DateTimeType)
  3294.                 return true;
  3295.             if (clrType == DecimalType)
  3296.                 return true;
  3297.             if (clrType == DoubleType)
  3298.                 return true;
  3299.             if (clrType == Int16Type)
  3300.                 return true;
  3301.             if (clrType == Int32Type)
  3302.                 return true;
  3303.             if (clrType == Int64Type)
  3304.                 return true;
  3305.             if (clrType == SByteType)
  3306.                 return true;
  3307.             if (clrType == SingleType)
  3308.                 return true;
  3309.             if (clrType == TimeSpanType)
  3310.                 return true;
  3311.             if (clrType == UInt16Type)
  3312.                 return true;
  3313.             if (clrType == UInt32Type)
  3314.                 return true;
  3315.             if (clrType == UInt64Type)
  3316.                 return true;
  3317.             if (clrType == UriType)
  3318.                 return true;
  3319.             if (clrType == XmlQualifiedNameType)
  3320.                 return true;
  3321.            
  3322.             return false;
  3323.         }
  3324.     }
  3325.    
  3326.     internal class XmlNodeConverter : XmlBaseConverter
  3327.     {
  3328.         protected XmlNodeConverter() : base(XmlTypeCode.Node)
  3329.         {
  3330.         }
  3331.        
  3332.         public static readonly XmlValueConverter Node = new XmlNodeConverter();
  3333.        
  3334.         #region AUTOGENERATED_XMLNODECONVERTER
  3335.        
  3336.         //-----------------------------------------------
  3337.         // ToBoolean
  3338.         //-----------------------------------------------
  3339.        
  3340.         // This converter does not support conversions to Boolean.
  3341.        
  3342.        
  3343.         //-----------------------------------------------
  3344.         // ToDateTime
  3345.         //-----------------------------------------------
  3346.        
  3347.         // This converter does not support conversions to DateTime.
  3348.        
  3349.        
  3350.         //-----------------------------------------------
  3351.         // ToDecimal
  3352.         //-----------------------------------------------
  3353.        
  3354.         // This converter does not support conversions to Decimal.
  3355.        
  3356.        
  3357.         //-----------------------------------------------
  3358.         // ToDouble
  3359.         //-----------------------------------------------
  3360.        
  3361.         // This converter does not support conversions to Double.
  3362.        
  3363.        
  3364.         //-----------------------------------------------
  3365.         // ToInt32
  3366.         //-----------------------------------------------
  3367.        
  3368.         // This converter does not support conversions to Int32.
  3369.        
  3370.        
  3371.         //-----------------------------------------------
  3372.         // ToInt64
  3373.         //-----------------------------------------------
  3374.        
  3375.         // This converter does not support conversions to Int64.
  3376.        
  3377.        
  3378.         //-----------------------------------------------
  3379.         // ToSingle
  3380.         //-----------------------------------------------
  3381.        
  3382.         // This converter does not support conversions to Single.
  3383.        
  3384.        
  3385.         //-----------------------------------------------
  3386.         // ToString
  3387.         //-----------------------------------------------
  3388.        
  3389.         // This converter does not support conversions to String.
  3390.        
  3391.        
  3392.         //-----------------------------------------------
  3393.         // ChangeType
  3394.         //-----------------------------------------------
  3395.        
  3396.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3397.         {
  3398.             if (value == null)
  3399.                 throw new ArgumentNullException("value");
  3400.             if (destinationType == null)
  3401.                 throw new ArgumentNullException("destinationType");
  3402.            
  3403.             Type sourceType = value.GetType();
  3404.            
  3405.             if (destinationType == ObjectType)
  3406.                 destinationType = DefaultClrType;
  3407.             if (destinationType == XPathNavigatorType) {
  3408.                 if (IsDerivedFrom(sourceType, XPathNavigatorType))
  3409.                     return ((XPathNavigator)value);
  3410.             }
  3411.             if (destinationType == XPathItemType) {
  3412.                 if (IsDerivedFrom(sourceType, XPathNavigatorType))
  3413.                     return ((XPathItem)value);
  3414.             }
  3415.            
  3416.             return ChangeListType(value, destinationType, nsResolver);
  3417.         }
  3418.         #endregion
  3419.     }
  3420.    
  3421.     internal class XmlAnyConverter : XmlBaseConverter
  3422.     {
  3423.         protected XmlAnyConverter(XmlTypeCode typeCode) : base(typeCode)
  3424.         {
  3425.         }
  3426.        
  3427.         public static readonly XmlValueConverter Item = new XmlAnyConverter(XmlTypeCode.Item);
  3428.         public static readonly XmlValueConverter AnyAtomic = new XmlAnyConverter(XmlTypeCode.AnyAtomicType);
  3429.        
  3430.         #region AUTOGENERATED_XMLANYCONVERTER
  3431.        
  3432.         //-----------------------------------------------
  3433.         // ToBoolean
  3434.         //-----------------------------------------------
  3435.        
  3436.         public override bool ToBoolean(object value)
  3437.         {
  3438.             if (value == null)
  3439.                 throw new ArgumentNullException("value");
  3440.            
  3441.             Type sourceType = value.GetType();
  3442.            
  3443.             if (sourceType == XmlAtomicValueType)
  3444.                 return ((XmlAtomicValue)value).ValueAsBoolean;
  3445.            
  3446.             return (bool)ChangeTypeWildcardDestination(value, BooleanType, null);
  3447.         }
  3448.        
  3449.        
  3450.         //-----------------------------------------------
  3451.         // ToDateTime
  3452.         //-----------------------------------------------
  3453.        
  3454.         public override DateTime ToDateTime(object value)
  3455.         {
  3456.             if (value == null)
  3457.                 throw new ArgumentNullException("value");
  3458.            
  3459.             Type sourceType = value.GetType();
  3460.            
  3461.             if (sourceType == XmlAtomicValueType)
  3462.                 return ((XmlAtomicValue)value).ValueAsDateTime;
  3463.            
  3464.             return (DateTime)ChangeTypeWildcardDestination(value, DateTimeType, null);
  3465.         }
  3466.        
  3467.        
  3468.         //-----------------------------------------------
  3469.         // ToDecimal
  3470.         //-----------------------------------------------
  3471.        
  3472.         public override decimal ToDecimal(object value)
  3473.         {
  3474.             if (value == null)
  3475.                 throw new ArgumentNullException("value");
  3476.            
  3477.             Type sourceType = value.GetType();
  3478.            
  3479.             if (sourceType == XmlAtomicValueType)
  3480.                 return ((decimal)((XmlAtomicValue)value).ValueAs(DecimalType));
  3481.            
  3482.             return (decimal)ChangeTypeWildcardDestination(value, DecimalType, null);
  3483.         }
  3484.        
  3485.        
  3486.         //-----------------------------------------------
  3487.         // ToDouble
  3488.         //-----------------------------------------------
  3489.        
  3490.         public override double ToDouble(object value)
  3491.         {
  3492.             if (value == null)
  3493.                 throw new ArgumentNullException("value");
  3494.            
  3495.             Type sourceType = value.GetType();
  3496.            
  3497.             if (sourceType == XmlAtomicValueType)
  3498.                 return ((XmlAtomicValue)value).ValueAsDouble;
  3499.            
  3500.             return (double)ChangeTypeWildcardDestination(value, DoubleType, null);
  3501.         }
  3502.        
  3503.        
  3504.         //-----------------------------------------------
  3505.         // ToInt32
  3506.         //-----------------------------------------------
  3507.        
  3508.         public override int ToInt32(object value)
  3509.         {
  3510.             if (value == null)
  3511.                 throw new ArgumentNullException("value");
  3512.            
  3513.             Type sourceType = value.GetType();
  3514.            
  3515.             if (sourceType == XmlAtomicValueType)
  3516.                 return ((XmlAtomicValue)value).ValueAsInt;
  3517.            
  3518.             return (int)ChangeTypeWildcardDestination(value, Int32Type, null);
  3519.         }
  3520.        
  3521.        
  3522.         //-----------------------------------------------
  3523.         // ToInt64
  3524.         //-----------------------------------------------
  3525.        
  3526.         public override long ToInt64(object value)
  3527.         {
  3528.             if (value == null)
  3529.                 throw new ArgumentNullException("value");
  3530.            
  3531.             Type sourceType = value.GetType();
  3532.            
  3533.             if (sourceType == XmlAtomicValueType)
  3534.                 return ((XmlAtomicValue)value).ValueAsLong;
  3535.            
  3536.             return (long)ChangeTypeWildcardDestination(value, Int64Type, null);
  3537.         }
  3538.        
  3539.        
  3540.         //-----------------------------------------------
  3541.         // ToSingle
  3542.         //-----------------------------------------------
  3543.        
  3544.         public override float ToSingle(object value)
  3545.         {
  3546.             if (value == null)
  3547.                 throw new ArgumentNullException("value");
  3548.            
  3549.             Type sourceType = value.GetType();
  3550.            
  3551.             if (sourceType == XmlAtomicValueType)
  3552.                 return ((float)((XmlAtomicValue)value).ValueAs(SingleType));
  3553.            
  3554.             return (float)ChangeTypeWildcardDestination(value, SingleType, null);
  3555.         }
  3556.        
  3557.        
  3558.         //-----------------------------------------------
  3559.         // ToString
  3560.         //-----------------------------------------------
  3561.        
  3562.         // This converter does not support conversions to String.
  3563.        
  3564.        
  3565.         //-----------------------------------------------
  3566.         // ChangeType
  3567.         //-----------------------------------------------
  3568.        
  3569.         public override object ChangeType(bool value, Type destinationType)
  3570.         {
  3571.             if (destinationType == null)
  3572.                 throw new ArgumentNullException("destinationType");
  3573.            
  3574.             if (destinationType == ObjectType)
  3575.                 destinationType = DefaultClrType;
  3576.             if (destinationType == XmlAtomicValueType)
  3577.                 return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Boolean), (bool)value));
  3578.            
  3579.             return ChangeTypeWildcardSource(value, destinationType, null);
  3580.         }
  3581.        
  3582.         public override object ChangeType(DateTime value, Type destinationType)
  3583.         {
  3584.             if (destinationType == null)
  3585.                 throw new ArgumentNullException("destinationType");
  3586.            
  3587.             if (destinationType == ObjectType)
  3588.                 destinationType = DefaultClrType;
  3589.             if (destinationType == XmlAtomicValueType)
  3590.                 return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.DateTime), (DateTime)value));
  3591.            
  3592.             return ChangeTypeWildcardSource(value, destinationType, null);
  3593.         }
  3594.        
  3595.         public override object ChangeType(decimal value, Type destinationType)
  3596.         {
  3597.             if (destinationType == null)
  3598.                 throw new ArgumentNullException("destinationType");
  3599.            
  3600.             if (destinationType == ObjectType)
  3601.                 destinationType = DefaultClrType;
  3602.             if (destinationType == XmlAtomicValueType)
  3603.                 return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Decimal), value));
  3604.            
  3605.             return ChangeTypeWildcardSource(value, destinationType, null);
  3606.         }
  3607.        
  3608.         public override object ChangeType(double value, Type destinationType)
  3609.         {
  3610.             if (destinationType == null)
  3611.                 throw new ArgumentNullException("destinationType");
  3612.            
  3613.             if (destinationType == ObjectType)
  3614.                 destinationType = DefaultClrType;
  3615.             if (destinationType == XmlAtomicValueType)
  3616.                 return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Double), (double)value));
  3617.            
  3618.             return ChangeTypeWildcardSource(value, destinationType, null);
  3619.         }
  3620.        
  3621.         public override object ChangeType(int value, Type destinationType)
  3622.         {
  3623.             if (destinationType == null)
  3624.                 throw new ArgumentNullException("destinationType");
  3625.            
  3626.             if (destinationType == ObjectType)
  3627.                 destinationType = DefaultClrType;
  3628.             if (destinationType == XmlAtomicValueType)
  3629.                 return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Int), (int)value));
  3630.            
  3631.             return ChangeTypeWildcardSource(value, destinationType, null);
  3632.         }
  3633.        
  3634.         public override object ChangeType(long value, Type destinationType)
  3635.         {
  3636.             if (destinationType == null)
  3637.                 throw new ArgumentNullException("destinationType");
  3638.            
  3639.             if (destinationType == ObjectType)
  3640.                 destinationType = DefaultClrType;
  3641.             if (destinationType == XmlAtomicValueType)
  3642.                 return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Long), (long)value));
  3643.            
  3644.             return ChangeTypeWildcardSource(value, destinationType, null);
  3645.         }
  3646.        
  3647.         public override object ChangeType(float value, Type destinationType)
  3648.         {
  3649.             if (destinationType == null)
  3650.                 throw new ArgumentNullException("destinationType");
  3651.            
  3652.             if (destinationType == ObjectType)
  3653.                 destinationType = DefaultClrType;
  3654.             if (destinationType == XmlAtomicValueType)
  3655.                 return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Float), value));
  3656.            
  3657.             return ChangeTypeWildcardSource(value, destinationType, null);
  3658.         }
  3659.        
  3660.         public override object ChangeType(string value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3661.         {
  3662.             if (value == null)
  3663.                 throw new ArgumentNullException("value");
  3664.             if (destinationType == null)
  3665.                 throw new ArgumentNullException("destinationType");
  3666.            
  3667.             if (destinationType == ObjectType)
  3668.                 destinationType = DefaultClrType;
  3669.             if (destinationType == XmlAtomicValueType)
  3670.                 return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String), (string)value));
  3671.            
  3672.             return ChangeTypeWildcardSource(value, destinationType, nsResolver);
  3673.         }
  3674.        
  3675.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3676.         {
  3677.             if (value == null)
  3678.                 throw new ArgumentNullException("value");
  3679.             if (destinationType == null)
  3680.                 throw new ArgumentNullException("destinationType");
  3681.            
  3682.             Type sourceType = value.GetType();
  3683.            
  3684.             if (destinationType == ObjectType)
  3685.                 destinationType = DefaultClrType;
  3686.             if (destinationType == BooleanType) {
  3687.                 if (sourceType == XmlAtomicValueType)
  3688.                     return ((XmlAtomicValue)value).ValueAsBoolean;
  3689.             }
  3690.             if (destinationType == DateTimeType) {
  3691.                 if (sourceType == XmlAtomicValueType)
  3692.                     return ((XmlAtomicValue)value).ValueAsDateTime;
  3693.             }
  3694.             if (destinationType == DecimalType) {
  3695.                 if (sourceType == XmlAtomicValueType)
  3696.                     return ((decimal)((XmlAtomicValue)value).ValueAs(DecimalType));
  3697.             }
  3698.             if (destinationType == DoubleType) {
  3699.                 if (sourceType == XmlAtomicValueType)
  3700.                     return ((XmlAtomicValue)value).ValueAsDouble;
  3701.             }
  3702.             if (destinationType == Int32Type) {
  3703.                 if (sourceType == XmlAtomicValueType)
  3704.                     return ((XmlAtomicValue)value).ValueAsInt;
  3705.             }
  3706.             if (destinationType == Int64Type) {
  3707.                 if (sourceType == XmlAtomicValueType)
  3708.                     return ((XmlAtomicValue)value).ValueAsLong;
  3709.             }
  3710.             if (destinationType == SingleType) {
  3711.                 if (sourceType == XmlAtomicValueType)
  3712.                     return ((float)((XmlAtomicValue)value).ValueAs(SingleType));
  3713.             }
  3714.             if (destinationType == XmlAtomicValueType) {
  3715.                 if (sourceType == XmlAtomicValueType)
  3716.                     return ((XmlAtomicValue)value);
  3717.                 if (sourceType == BooleanType)
  3718.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Boolean), (bool)value));
  3719.                 if (sourceType == ByteType)
  3720.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.UnsignedByte), value));
  3721.                 if (sourceType == ByteArrayType)
  3722.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Base64Binary), value));
  3723.                 if (sourceType == DateTimeType)
  3724.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.DateTime), (DateTime)value));
  3725.                 if (sourceType == DecimalType)
  3726.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Decimal), value));
  3727.                 if (sourceType == DoubleType)
  3728.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Double), (double)value));
  3729.                 if (sourceType == Int16Type)
  3730.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Short), value));
  3731.                 if (sourceType == Int32Type)
  3732.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Int), (int)value));
  3733.                 if (sourceType == Int64Type)
  3734.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Long), (long)value));
  3735.                 if (sourceType == SByteType)
  3736.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Byte), value));
  3737.                 if (sourceType == SingleType)
  3738.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Float), value));
  3739.                 if (sourceType == StringType)
  3740.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String), (string)value));
  3741.                 if (sourceType == TimeSpanType)
  3742.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.Duration), value));
  3743.                 if (sourceType == UInt16Type)
  3744.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.UnsignedShort), value));
  3745.                 if (sourceType == UInt32Type)
  3746.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.UnsignedInt), value));
  3747.                 if (sourceType == UInt64Type)
  3748.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.UnsignedLong), value));
  3749.                 if (IsDerivedFrom(sourceType, UriType))
  3750.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.AnyUri), value));
  3751.                 if (IsDerivedFrom(sourceType, XmlQualifiedNameType))
  3752.                     return (new XmlAtomicValue(XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.QName), value, nsResolver));
  3753.             }
  3754.             if (destinationType == XPathItemType) {
  3755.                 if (sourceType == XmlAtomicValueType)
  3756.                     return ((XmlAtomicValue)value);
  3757.                 if (IsDerivedFrom(sourceType, XPathNavigatorType))
  3758.                     return ((XPathNavigator)value);
  3759.             }
  3760.             if (destinationType == XPathNavigatorType) {
  3761.                 if (IsDerivedFrom(sourceType, XPathNavigatorType))
  3762.                     return ToNavigator((XPathNavigator)value);
  3763.             }
  3764.             if (destinationType == XPathItemType)
  3765.                 return ((XPathItem)this.ChangeType(value, XmlAtomicValueType, nsResolver));
  3766.             if (sourceType == XmlAtomicValueType)
  3767.                 return ((XmlAtomicValue)value).ValueAs(destinationType, nsResolver);
  3768.            
  3769.             return ChangeListType(value, destinationType, nsResolver);
  3770.         }
  3771.        
  3772.        
  3773.         //-----------------------------------------------
  3774.         // Helpers
  3775.         //-----------------------------------------------
  3776.        
  3777.         private object ChangeTypeWildcardDestination(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3778.         {
  3779.             Type sourceType = value.GetType();
  3780.            
  3781.             if (sourceType == XmlAtomicValueType)
  3782.                 return ((XmlAtomicValue)value).ValueAs(destinationType, nsResolver);
  3783.            
  3784.             return ChangeListType(value, destinationType, nsResolver);
  3785.         }
  3786.         private object ChangeTypeWildcardSource(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3787.         {
  3788.             if (destinationType == XPathItemType)
  3789.                 return ((XPathItem)this.ChangeType(value, XmlAtomicValueType, nsResolver));
  3790.            
  3791.             return ChangeListType(value, destinationType, nsResolver);
  3792.         }
  3793.         #endregion
  3794.        
  3795.         /// <summary>
  3796.         /// Throw an exception if nodes are not allowed by this converter.
  3797.         /// </summary>
  3798.         private XPathNavigator ToNavigator(XPathNavigator nav)
  3799.         {
  3800.             if (TypeCode != XmlTypeCode.Item)
  3801.                 throw CreateInvalidClrMappingException(XPathNavigatorType, XPathNavigatorType);
  3802.            
  3803.             return nav;
  3804.         }
  3805.     }
  3806.    
  3807.     internal class XmlAnyListConverter : XmlListConverter
  3808.     {
  3809.         protected XmlAnyListConverter(XmlBaseConverter atomicConverter) : base(atomicConverter)
  3810.         {
  3811.         }
  3812.        
  3813.         public static readonly XmlValueConverter ItemList = new XmlAnyListConverter((XmlBaseConverter)XmlAnyConverter.Item);
  3814.         public static readonly XmlValueConverter AnyAtomicList = new XmlAnyListConverter((XmlBaseConverter)XmlAnyConverter.AnyAtomic);
  3815.        
  3816.        
  3817.         //-----------------------------------------------
  3818.         // ChangeType
  3819.         //-----------------------------------------------
  3820.        
  3821.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3822.         {
  3823.             if (value == null)
  3824.                 throw new ArgumentNullException("value");
  3825.             if (destinationType == null)
  3826.                 throw new ArgumentNullException("destinationType");
  3827.            
  3828.             // If source value does not implement IEnumerable, or it is a string or byte[],
  3829.             if (!(value is IEnumerable) || value.GetType() == StringType || value.GetType() == ByteArrayType) {
  3830.                 // Then create a list from it
  3831.                 value = new object[] {value};
  3832.             }
  3833.            
  3834.             return ChangeListType(value, destinationType, nsResolver);
  3835.         }
  3836.     }
  3837.    
  3838.     internal class XmlListConverter : XmlBaseConverter
  3839.     {
  3840.         protected XmlValueConverter atomicConverter;
  3841.        
  3842.         protected XmlListConverter(XmlBaseConverter atomicConverter) : base(atomicConverter)
  3843.         {
  3844.             this.atomicConverter = atomicConverter;
  3845.         }
  3846.        
  3847.         protected XmlListConverter(XmlBaseConverter atomicConverter, Type clrTypeDefault) : base(atomicConverter, clrTypeDefault)
  3848.         {
  3849.             this.atomicConverter = atomicConverter;
  3850.         }
  3851.        
  3852.         protected XmlListConverter(XmlSchemaType schemaType) : base(schemaType)
  3853.         {
  3854.         }
  3855.        
  3856.         public static XmlValueConverter Create(XmlValueConverter atomicConverter)
  3857.         {
  3858.             if (atomicConverter == XmlUntypedConverter.Untyped)
  3859.                 return XmlUntypedConverter.UntypedList;
  3860.            
  3861.             if (atomicConverter == XmlAnyConverter.Item)
  3862.                 return XmlAnyListConverter.ItemList;
  3863.            
  3864.             if (atomicConverter == XmlAnyConverter.AnyAtomic)
  3865.                 return XmlAnyListConverter.AnyAtomicList;
  3866.            
  3867.             Debug.Assert(!(atomicConverter is XmlListConverter) || ((XmlListConverter)atomicConverter).atomicConverter == null, "List converters should not be nested within one another.");
  3868.            
  3869.             return new XmlListConverter((XmlBaseConverter)atomicConverter);
  3870.         }
  3871.        
  3872.        
  3873.         //-----------------------------------------------
  3874.         // ChangeType
  3875.         //-----------------------------------------------
  3876.        
  3877.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3878.         {
  3879.             if (value == null)
  3880.                 throw new ArgumentNullException("value");
  3881.             if (destinationType == null)
  3882.                 throw new ArgumentNullException("destinationType");
  3883.            
  3884.             return ChangeListType(value, destinationType, nsResolver);
  3885.         }
  3886.        
  3887.        
  3888.         //------------------------------------------------------------------------
  3889.         // Helpers
  3890.         //------------------------------------------------------------------------
  3891.        
  3892.         protected override object ChangeListType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  3893.         {
  3894.             Type sourceType = value.GetType();
  3895.            
  3896.             if (destinationType == ObjectType)
  3897.                 destinationType = DefaultClrType;
  3898.            
  3899.             // Input value must support IEnumerable and destination type should be IEnumerable, ICollection, IList, Type[], or String
  3900.             if (!(value is IEnumerable) || !IsListType(destinationType))
  3901.                 throw CreateInvalidClrMappingException(sourceType, destinationType);
  3902.            
  3903.             // Handle case where destination type is a string
  3904.             if (destinationType == StringType) {
  3905.                 // Conversion from string to string is a no-op
  3906.                 if (sourceType == StringType)
  3907.                     return value;
  3908.                
  3909.                 // Convert from list to string
  3910.                 return ListAsString((IEnumerable)value, nsResolver);
  3911.             }
  3912.            
  3913.             // Handle case where source type is a string
  3914.             // Tokenize string and create a list out of resulting string tokens
  3915.             if (sourceType == StringType)
  3916.                 value = StringAsList((string)value);
  3917.            
  3918.             if (destinationType.IsArray) {
  3919.                 // Convert from source value to strongly-typed array; special-case each possible item type for performance
  3920.                 Type itemTypeDst = destinationType.GetElementType();
  3921.                
  3922.                 // Converting from object[] to object[] is not necessarily a no-op (i.e. xs:int* stored as an object[]
  3923.                 // containing String values will need to be converted to an object[] containing Int32 values).
  3924.                 if (itemTypeDst == ObjectType)
  3925.                     return ToArray<object>(value, nsResolver);
  3926.                
  3927.                 // For all types except object[], sourceType = destinationType is a no-op conversion
  3928.                 if (sourceType == destinationType)
  3929.                     return value;
  3930.                
  3931.                 // Otherwise, iterate over values in source list, convert them to output item type, and store them in result array
  3932.                 if (itemTypeDst == BooleanType)
  3933.                     return ToArray<bool>(value, nsResolver);
  3934.                 if (itemTypeDst == ByteType)
  3935.                     return ToArray<byte>(value, nsResolver);
  3936.                 if (itemTypeDst == ByteArrayType)
  3937.                     return ToArray<byte[]>(value, nsResolver);
  3938.                 if (itemTypeDst == DateTimeType)
  3939.                     return ToArray<DateTime>(value, nsResolver);
  3940.                 if (itemTypeDst == DecimalType)
  3941.                     return ToArray<decimal>(value, nsResolver);
  3942.                 if (itemTypeDst == DoubleType)
  3943.                     return ToArray<double>(value, nsResolver);
  3944.                 if (itemTypeDst == Int16Type)
  3945.                     return ToArray<short>(value, nsResolver);
  3946.                 if (itemTypeDst == Int32Type)
  3947.                     return ToArray<int>(value, nsResolver);
  3948.                 if (itemTypeDst == Int64Type)
  3949.                     return ToArray<long>(value, nsResolver);
  3950.                 if (itemTypeDst == SByteType)
  3951.                     return ToArray<sbyte>(value, nsResolver);
  3952.                 if (itemTypeDst == SingleType)
  3953.                     return ToArray<float>(value, nsResolver);
  3954.                 if (itemTypeDst == StringType)
  3955.                     return ToArray<string>(value, nsResolver);
  3956.                 if (itemTypeDst == TimeSpanType)
  3957.                     return ToArray<TimeSpan>(value, nsResolver);
  3958.                 if (itemTypeDst == UInt16Type)
  3959.                     return ToArray<ushort>(value, nsResolver);
  3960.                 if (itemTypeDst == UInt32Type)
  3961.                     return ToArray<uint>(value, nsResolver);
  3962.                 if (itemTypeDst == UInt64Type)
  3963.                     return ToArray<ulong>(value, nsResolver);
  3964.                 if (itemTypeDst == UriType)
  3965.                     return ToArray<Uri>(value, nsResolver);
  3966.                 if (itemTypeDst == XmlAtomicValueType)
  3967.                     return ToArray<XmlAtomicValue>(value, nsResolver);
  3968.                 if (itemTypeDst == XmlQualifiedNameType)
  3969.                     return ToArray<XmlQualifiedName>(value, nsResolver);
  3970.                 if (itemTypeDst == XPathItemType)
  3971.                     return ToArray<XPathItem>(value, nsResolver);
  3972.                 if (itemTypeDst == XPathNavigatorType)
  3973.                     return ToArray<XPathNavigator>(value, nsResolver);
  3974.                
  3975.                 throw CreateInvalidClrMappingException(sourceType, destinationType);
  3976.             }
  3977.            
  3978.             // Destination type is IList, ICollection or IEnumerable
  3979.             // If source value is an array of values having the default representation, then conversion is a no-op
  3980.             if (sourceType == DefaultClrType && sourceType != ObjectArrayType)
  3981.                 return value;
  3982.            
  3983.             return ToList(value, nsResolver);
  3984.         }
  3985.        
  3986.         /// <summary>
  3987.         /// Return true if "type" is one of the following:
  3988.         /// 1. IList, ICollection, IEnumerable
  3989.         /// 2. A strongly-typed array
  3990.         /// 3. A string
  3991.         /// </summary>
  3992.         private bool IsListType(Type type)
  3993.         {
  3994.             // IsClrListType returns true if "type" is one of the list interfaces
  3995.             if (type == IListType || type == ICollectionType || type == IEnumerableType || type == StringType)
  3996.                 return true;
  3997.            
  3998.             return type.IsArray;
  3999.         }
  4000.        
  4001.         /// <summary>
  4002.         /// Convert "list" to an array of type T by iterating over each item in "list" and converting it to type "T"
  4003.         /// by invoking the atomic converter.
  4004.         /// </summary>
  4005.         private T[] ToArray<T>(object list, IXmlNamespaceResolver nsResolver)
  4006.         {
  4007.             // IList --> Array<T>
  4008.             IList listSrc = list as IList;
  4009.             if (listSrc != null) {
  4010.                 T[] arrDst = new T[listSrc.Count];
  4011.                
  4012.                 for (int i = 0; i < listSrc.Count; i++)
  4013.                     arrDst[i] = (T)this.atomicConverter.ChangeType(listSrc[i], typeof(T), nsResolver);
  4014.                
  4015.                 return arrDst;
  4016.             }
  4017.            
  4018.             // IEnumerable --> Array<T>
  4019.             IEnumerable enumSrc = list as IEnumerable;
  4020.             Debug.Assert(enumSrc != null, "Value passed to ToArray must implement IEnumerable");
  4021.            
  4022.             List<T> listDst = new List<T>();
  4023.             foreach (object value in enumSrc)
  4024.                 listDst.Add((T)this.atomicConverter.ChangeType(value, typeof(T), nsResolver));
  4025.            
  4026.             return listDst.ToArray();
  4027.         }
  4028.        
  4029.         /// <summary>
  4030.         /// Convert "list" to an IList containing items in the atomic type's default representation.
  4031.         /// </summary>
  4032.         private IList ToList(object list, IXmlNamespaceResolver nsResolver)
  4033.         {
  4034.             // IList --> object[]
  4035.             IList listSrc = list as IList;
  4036.             if (listSrc != null) {
  4037.                 object[] arrDst = new object[listSrc.Count];
  4038.                
  4039.                 for (int i = 0; i < listSrc.Count; i++)
  4040.                     arrDst[i] = this.atomicConverter.ChangeType(listSrc[i], ObjectType, nsResolver);
  4041.                
  4042.                 return arrDst;
  4043.             }
  4044.            
  4045.             // IEnumerable --> List<object>
  4046.             IEnumerable enumSrc = list as IEnumerable;
  4047.             Debug.Assert(enumSrc != null, "Value passed to ToArray must implement IEnumerable");
  4048.            
  4049.             List<object> listDst = new List<object>();
  4050.             foreach (object value in enumSrc)
  4051.                 listDst.Add(this.atomicConverter.ChangeType(value, ObjectType, nsResolver));
  4052.            
  4053.             return listDst;
  4054.         }
  4055.        
  4056.         /// <summary>
  4057.         /// Tokenize "value" by splitting it on whitespace characters. Insert tokens into an ArrayList and return the list.
  4058.         /// </summary>
  4059.         private List<string> StringAsList(string value)
  4060.         {
  4061.             return new List<string>(XmlConvert.SplitString(value));
  4062.         }
  4063.        
  4064.         /// <summary>
  4065.         /// Convert a list to a corresponding list of strings. Then concatenate the strings, which adjacent values delimited
  4066.         /// by a space character.
  4067.         /// </summary>
  4068.         private string ListAsString(IEnumerable list, IXmlNamespaceResolver nsResolver)
  4069.         {
  4070.             StringBuilder bldr = new StringBuilder();
  4071.            
  4072.             foreach (object value in list) {
  4073.                 // Separate values by single space character
  4074.                 if (bldr.Length != 0)
  4075.                     bldr.Append(' ');
  4076.                
  4077.                 // Append string value of next item in the list
  4078.                 bldr.Append(this.atomicConverter.ToString(value, nsResolver));
  4079.             }
  4080.            
  4081.             return bldr.ToString();
  4082.         }
  4083.        
  4084.         /// <summary>
  4085.         /// Create an InvalidCastException for cases where either "destinationType" or "sourceType" is not a supported CLR representation
  4086.         /// for this Xml type.
  4087.         /// </summary>
  4088.         private new Exception CreateInvalidClrMappingException(Type sourceType, Type destinationType)
  4089.         {
  4090.             if (sourceType == destinationType)
  4091.                 return new InvalidCastException(Res.GetString(Res.XmlConvert_TypeListBadMapping, XmlTypeName, sourceType.Name));
  4092.            
  4093.             return new InvalidCastException(Res.GetString(Res.XmlConvert_TypeListBadMapping2, XmlTypeName, sourceType.Name, destinationType.Name));
  4094.         }
  4095.     }
  4096.    
  4097.     internal class XmlUnionConverter : XmlBaseConverter
  4098.     {
  4099.         private XmlValueConverter[] converters;
  4100.         private bool hasAtomicMember, hasListMember;
  4101.        
  4102.         protected XmlUnionConverter(XmlSchemaType schemaType) : base(schemaType)
  4103.         {
  4104.             // Skip restrictions. It is safe to do that because this is a union, so it's not a built-in type
  4105.             while (schemaType.DerivedBy == XmlSchemaDerivationMethod.Restriction)
  4106.                 schemaType = schemaType.BaseXmlSchemaType;
  4107.            
  4108.             // Get a converter for each member type in the union
  4109.             Debug.Assert(schemaType.DerivedBy == XmlSchemaDerivationMethod.Union);
  4110.             XmlSchemaSimpleType[] memberTypes = ((XmlSchemaSimpleTypeUnion)((XmlSchemaSimpleType)schemaType).Content).BaseMemberTypes;
  4111.            
  4112.             this.converters = new XmlValueConverter[memberTypes.Length];
  4113.             for (int i = 0; i < memberTypes.Length; i++) {
  4114.                 this.converters[i] = memberTypes[i].ValueConverter;
  4115.                
  4116.                 // Track whether this union's member types include a list type
  4117.                 if (memberTypes[i].Datatype.Variety == XmlSchemaDatatypeVariety.List)
  4118.                     this.hasListMember = true;
  4119.                 else if (memberTypes[i].Datatype.Variety == XmlSchemaDatatypeVariety.Atomic)
  4120.                     this.hasAtomicMember = true;
  4121.             }
  4122.         }
  4123.        
  4124.         public static XmlValueConverter Create(XmlSchemaType schemaType)
  4125.         {
  4126.             return new XmlUnionConverter(schemaType);
  4127.         }
  4128.        
  4129.        
  4130.         //-----------------------------------------------
  4131.         // ChangeType
  4132.         //-----------------------------------------------
  4133.        
  4134.         public override object ChangeType(object value, Type destinationType, IXmlNamespaceResolver nsResolver)
  4135.         {
  4136.             if (value == null)
  4137.                 throw new ArgumentNullException("value");
  4138.             if (destinationType == null)
  4139.                 throw new ArgumentNullException("destinationType");
  4140.            
  4141.             Type sourceType = value.GetType();
  4142.            
  4143.             // If source value is an XmlAtomicValue, then allow it to perform the conversion
  4144.             if (sourceType == XmlAtomicValueType && hasAtomicMember)
  4145.                 return ((XmlAtomicValue)value).ValueAs(destinationType, nsResolver);
  4146.            
  4147.             // If source value is an XmlAtomicValue[], then use item* converter
  4148.             if (sourceType == XmlAtomicValueArrayType && hasListMember)
  4149.                 return XmlAnyListConverter.ItemList.ChangeType(value, destinationType, nsResolver);
  4150.            
  4151.             // If source value is a string, then validate the string in order to determine the member type
  4152.             if (sourceType == StringType) {
  4153.                 if (destinationType == StringType)
  4154.                     return value;
  4155.                
  4156.                 XsdSimpleValue simpleValue = (XsdSimpleValue)SchemaType.Datatype.ParseValue((string)value, new NameTable(), nsResolver, true);
  4157.                
  4158.                 // Allow the member type to perform the conversion
  4159.                 return simpleValue.XmlType.ValueConverter.ChangeType((string)value, destinationType, nsResolver);
  4160.             }
  4161.            
  4162.             throw CreateInvalidClrMappingException(sourceType, destinationType);
  4163.         }
  4164.     }
  4165. }

Developer Fusion