public static Object ChangeType(Object value, TypeCode typeCode, IFormatProvider provider) {
if (value == null && (typeCode == TypeCode.Empty || typeCode == TypeCode.String || typeCode == TypeCode.Object)) {
return null;
}
IConvertible v = value as IConvertible;
if (v == null) {
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_IConvertible"));
}
// This line is invalid for things like Enums that return a TypeCode
// of Int32, but the object can't actually be cast to an Int32.
// if (v.GetTypeCode() == typeCode) return value;
switch (typeCode) {
case TypeCode.Boolean:
return v.ToBoolean(provider);
case TypeCode.Char:
return v.ToChar(provider);
case TypeCode.SByte:
return v.ToSByte(provider);
case TypeCode.Byte:
return v.ToByte(provider);
case TypeCode.Int16:
return v.ToInt16(provider);
case TypeCode.UInt16:
return v.ToUInt16(provider);
case TypeCode.Int32:
return v.ToInt32(provider);
case TypeCode.UInt32:
return v.ToUInt32(provider);
case TypeCode.Int64:
return v.ToInt64(provider);
case TypeCode.UInt64:
return v.ToUInt64(provider);
case TypeCode.Single:
return v.ToSingle(provider);
case TypeCode.Double:
return v.ToDouble(provider);
case TypeCode.Decimal:
return v.ToDecimal(provider);
case TypeCode.DateTime:
return v.ToDateTime(provider);
case TypeCode.String:
return v.ToString(provider);
case TypeCode.Object:
return value;
case TypeCode.DBNull:
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_DBNull"));
case TypeCode.Empty:
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_Empty"));
default:
throw new ArgumentException(Environment.GetResourceString("Arg_UnknownTypeCode"));
}
}