public static object ChangeTypeForXML(object value, Type type)
{
Debug.Assert(value is string || type == typeof(string), "invalid call to ChangeTypeForXML");
StorageType destinationType = DataStorage.GetStorageType(type);
Type valueType = value.GetType();
StorageType vtype = DataStorage.GetStorageType(valueType);
switch (destinationType)
{ // if destination is not string
case StorageType.SqlBinary:
return new SqlBinary(Convert.FromBase64String((string)value));
case StorageType.SqlBoolean:
return new SqlBoolean(XmlConvert.ToBoolean((string)value));
case StorageType.SqlByte:
return new SqlByte(XmlConvert.ToByte((string)value));
case StorageType.SqlBytes:
return new SqlBytes(Convert.FromBase64String((string)value));
case StorageType.SqlChars:
return new SqlChars(((string)value).ToCharArray());
case StorageType.SqlDateTime:
return new SqlDateTime(XmlConvert.ToDateTime((string)value, XmlDateTimeSerializationMode.RoundtripKind));
case StorageType.SqlDecimal:
return SqlDecimal.Parse((string)value); // parses invariant format and is larger has larger range then Decimal
case StorageType.SqlDouble:
return new SqlDouble(XmlConvert.ToDouble((string)value));
case StorageType.SqlGuid:
return new SqlGuid(XmlConvert.ToGuid((string)value));
case StorageType.SqlInt16:
return new SqlInt16(XmlConvert.ToInt16((string)value));
case StorageType.SqlInt32:
return new SqlInt32(XmlConvert.ToInt32((string)value));
case StorageType.SqlInt64:
return new SqlInt64(XmlConvert.ToInt64((string)value));
case StorageType.SqlMoney:
return new SqlMoney(XmlConvert.ToDecimal((string)value));
case StorageType.SqlSingle:
return new SqlSingle(XmlConvert.ToSingle((string)value));
case StorageType.SqlString:
return new SqlString((string)value);
// case StorageType.SqlXml: // What to do
// if (DataStorage.IsObjectNull(value)) {
// return SqlXml.Null;
// }
// goto default;
case StorageType.Boolean:
if ("1" == (string)value) return true;
if ("0" == (string)value) return false;
return XmlConvert.ToBoolean((string)value);
case StorageType.Char:
return XmlConvert.ToChar((string)value);
case StorageType.SByte:
return XmlConvert.ToSByte((string)value);
case StorageType.Byte:
return XmlConvert.ToByte((string)value);
case StorageType.Int16:
return XmlConvert.ToInt16((string)value);
case StorageType.UInt16:
return XmlConvert.ToUInt16((string)value);
case StorageType.Int32:
return XmlConvert.ToInt32((string)value);
case StorageType.UInt32:
return XmlConvert.ToUInt32((string)value);
case StorageType.Int64:
return XmlConvert.ToInt64((string)value);
case StorageType.UInt64:
return XmlConvert.ToUInt64((string)value);
case StorageType.Single:
return XmlConvert.ToSingle((string)value);
case StorageType.Double:
return XmlConvert.ToDouble((string)value);
case StorageType.Decimal:
return XmlConvert.ToDecimal((string)value);
case StorageType.DateTime:
return XmlConvert.ToDateTime((string)value, XmlDateTimeSerializationMode.RoundtripKind);
case StorageType.Guid:
return XmlConvert.ToGuid((string)value);
case StorageType.Uri:
return new Uri((string)value);
case StorageType.DateTimeOffset:
return XmlConvert.ToDateTimeOffset((string)value);
case StorageType.TimeSpan:
switch (vtype)
{
case StorageType.String:
return XmlConvert.ToTimeSpan((string)value);
case StorageType.Int32:
return new TimeSpan((int)value);
case StorageType.Int64:
return new TimeSpan((long)value);
default:
return (TimeSpan)value;
}
default:
{
if ((DBNull.Value == value) || (null == value))
{
return DBNull.Value;
}
switch (vtype)
{ // To String
case StorageType.SqlBinary:
return Convert.ToBase64String(((SqlBinary)value).Value);
case StorageType.SqlBoolean:
return XmlConvert.ToString(((SqlBoolean)value).Value);
case StorageType.SqlByte:
return XmlConvert.ToString(((SqlByte)value).Value);
case StorageType.SqlBytes:
return Convert.ToBase64String(((SqlBytes)value).Value);
case StorageType.SqlChars:
return new string(((SqlChars)value).Value);
case StorageType.SqlDateTime:
return XmlConvert.ToString(((SqlDateTime)value).Value, XmlDateTimeSerializationMode.RoundtripKind);
case StorageType.SqlDecimal:
return ((SqlDecimal)value).ToString(); // converts using invariant format and is larger has larger range then Decimal
case StorageType.SqlDouble:
return XmlConvert.ToString(((SqlDouble)value).Value);
case StorageType.SqlGuid:
return XmlConvert.ToString(((SqlGuid)value).Value);
case StorageType.SqlInt16:
return XmlConvert.ToString(((SqlInt16)value).Value);
case StorageType.SqlInt32:
return XmlConvert.ToString(((SqlInt32)value).Value);
case StorageType.SqlInt64:
return XmlConvert.ToString(((SqlInt64)value).Value);
case StorageType.SqlMoney:
return XmlConvert.ToString(((SqlMoney)value).Value);
case StorageType.SqlSingle:
return XmlConvert.ToString(((SqlSingle)value).Value);
case StorageType.SqlString:
return ((SqlString)value).Value;
case StorageType.Boolean:
return XmlConvert.ToString((bool)value);
case StorageType.Char:
return XmlConvert.ToString((char)value);
case StorageType.SByte:
return XmlConvert.ToString((sbyte)value);
case StorageType.Byte:
return XmlConvert.ToString((byte)value);
case StorageType.Int16:
return XmlConvert.ToString((short)value);
case StorageType.UInt16:
return XmlConvert.ToString((ushort)value);
case StorageType.Int32:
return XmlConvert.ToString((int)value);
case StorageType.UInt32:
return XmlConvert.ToString((uint)value);
case StorageType.Int64:
return XmlConvert.ToString((long)value);
case StorageType.UInt64:
return XmlConvert.ToString((ulong)value);
case StorageType.Single:
return XmlConvert.ToString((float)value);
case StorageType.Double:
return XmlConvert.ToString((double)value);
case StorageType.Decimal:
return XmlConvert.ToString((decimal)value);
case StorageType.DateTime:
return XmlConvert.ToString((DateTime)value, XmlDateTimeSerializationMode.RoundtripKind);
case StorageType.TimeSpan:
return XmlConvert.ToString((TimeSpan)value);
case StorageType.Guid:
return XmlConvert.ToString((Guid)value);
case StorageType.String:
return (string)value;
case StorageType.CharArray:
return new string((char[])value);
case StorageType.DateTimeOffset:
return XmlConvert.ToString((DateTimeOffset)value);
default:
IConvertible iconvertible = (value as IConvertible);
if (null != iconvertible)
{
return iconvertible.ToString(System.Globalization.CultureInfo.InvariantCulture);
}
// catch additional classes like Guid
IFormattable iformattable = (value as IFormattable);
if (null != iformattable)
{
return iformattable.ToString(null, System.Globalization.CultureInfo.InvariantCulture);
}
return value.ToString();
}
}
}
}
}