public static Object ChangeType(Object value, Type conversionType, IFormatProvider provider) {
if( conversionType == null) {
throw new ArgumentNullException("conversionType");
}
if( value == null ) {
if(conversionType.IsValueType) {
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_CannotCastNullToValueType"));
}
return null;
}
IConvertible ic = value as IConvertible;
if (ic == null) {
if ( value.GetType() == conversionType) {
return value;
}
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_IConvertible"));
}
if (conversionType==ConvertTypes[(int)TypeCode.Boolean])
return ic.ToBoolean(provider);
if (conversionType==ConvertTypes[(int)TypeCode.Char])
return ic.ToChar(provider);
if (conversionType==ConvertTypes[(int)TypeCode.SByte])
return ic.ToSByte(provider);
if (conversionType==ConvertTypes[(int)TypeCode.Byte])
return ic.ToByte(provider);
if (conversionType==ConvertTypes[(int)TypeCode.Int16])
return ic.ToInt16(provider);
if (conversionType==ConvertTypes[(int)TypeCode.UInt16])
return ic.ToUInt16(provider);
if (conversionType==ConvertTypes[(int)TypeCode.Int32])
return ic.ToInt32(provider);
if (conversionType==ConvertTypes[(int)TypeCode.UInt32])
return ic.ToUInt32(provider);
if (conversionType==ConvertTypes[(int)TypeCode.Int64])
return ic.ToInt64(provider);
if (conversionType==ConvertTypes[(int)TypeCode.UInt64])
return ic.ToUInt64(provider);
if (conversionType==ConvertTypes[(int)TypeCode.Single])
return ic.ToSingle(provider);
if (conversionType==ConvertTypes[(int)TypeCode.Double])
return ic.ToDouble(provider);
if (conversionType==ConvertTypes[(int)TypeCode.Decimal])
return ic.ToDecimal(provider);
if (conversionType==ConvertTypes[(int)TypeCode.DateTime])
return ic.ToDateTime(provider);
if (conversionType==ConvertTypes[(int)TypeCode.String]) {
return ic.ToString(provider);
}
if (conversionType==ConvertTypes[(int)TypeCode.Object])
return (Object)value;
return ic.ToType(conversionType, provider);
}