internal static object ToType (object value, Type conversionType, IFormatProvider provider, bool try_target_to_type)
{
if (value == null) {
if ((conversionType != null) && conversionType.IsValueType){
#if NET_2_0
throw new InvalidCastException ("Null object can not be converted to a value type.");
#else
//
// Bug compatibility with 1.0
//
throw new NullReferenceException ("Null object can not be converted to a value type.");
#endif
} else
return null;
}
if (conversionType == null)
throw new InvalidCastException ("Cannot cast to destination type.");
if (value.GetType () == conversionType)
return value;
if (value is IConvertible) {
IConvertible convertValue = (IConvertible) value;
if (conversionType == conversionTable[0]) // 0 Empty
throw new ArgumentNullException ();
else if (conversionType == conversionTable[1]) // 1 TypeCode.Object
return (object) value;
else if (conversionType == conversionTable[2]) // 2 TypeCode.DBNull
throw new InvalidCastException (
"Cannot cast to DBNull, it's not IConvertible");
else if (conversionType == conversionTable[3]) // 3 TypeCode.Boolean
return (object) convertValue.ToBoolean (provider);
else if (conversionType == conversionTable[4]) // 4 TypeCode.Char
return (object) convertValue.ToChar (provider);
else if (conversionType == conversionTable[5]) // 5 TypeCode.SByte
return (object) convertValue.ToSByte (provider);
else if (conversionType == conversionTable[6]) // 6 TypeCode.Byte
return (object) convertValue.ToByte (provider);
else if (conversionType == conversionTable[7]) // 7 TypeCode.Int16
return (object) convertValue.ToInt16 (provider);
else if (conversionType == conversionTable[8]) // 8 TypeCode.UInt16
return (object) convertValue.ToUInt16 (provider);
else if (conversionType == conversionTable[9]) // 9 TypeCode.Int32
return (object) convertValue.ToInt32 (provider);
else if (conversionType == conversionTable[10]) // 10 TypeCode.UInt32
return (object) convertValue.ToUInt32 (provider);
else if (conversionType == conversionTable[11]) // 11 TypeCode.Int64
return (object) convertValue.ToInt64 (provider);
else if (conversionType == conversionTable[12]) // 12 TypeCode.UInt64
return (object) convertValue.ToUInt64 (provider);
else if (conversionType == conversionTable[13]) // 13 TypeCode.Single
return (object) convertValue.ToSingle (provider);
else if (conversionType == conversionTable[14]) // 14 TypeCode.Double
return (object) convertValue.ToDouble (provider);
else if (conversionType == conversionTable[15]) // 15 TypeCode.Decimal
return (object) convertValue.ToDecimal (provider);
else if (conversionType == conversionTable[16]) // 16 TypeCode.DateTime
return (object) convertValue.ToDateTime (provider);
else if (conversionType == conversionTable[18]) // 18 TypeCode.String
return (object) convertValue.ToString (provider);
else {
if (try_target_to_type)
return convertValue.ToType (conversionType, provider);
}
}
// Not in the conversion table
throw new InvalidCastException ((Locale.GetText (
"Value is not a convertible object: " + value.GetType().ToString() + " to " + conversionType.FullName)));
}
}