Convert.ChangeType 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
返回一个指定类型的对象,该对象的值等效于指定的对象。
重载
ChangeType(Object, Type) |
返回一个指定类型的对象,该对象的值等效于指定的对象。 |
ChangeType(Object, TypeCode) |
返回指定类型的对象,其值等效于指定对象。 |
ChangeType(Object, Type, IFormatProvider) |
返回指定类型的对象,其值等效于指定对象。 参数提供区域性特定的格式设置信息。 |
ChangeType(Object, TypeCode, IFormatProvider) |
返回指定类型的对象,其值等效于指定对象。 参数提供区域性特定的格式设置信息。 |
ChangeType(Object, Type)
返回一个指定类型的对象,该对象的值等效于指定的对象。
public:
static System::Object ^ ChangeType(System::Object ^ value, Type ^ conversionType);
public static object ChangeType (object value, Type conversionType);
public static object? ChangeType (object? value, Type conversionType);
static member ChangeType : obj * Type -> obj
Public Shared Function ChangeType (value As Object, conversionType As Type) As Object
参数
- value
- Object
一个实现 IConvertible 接口的对象。
- conversionType
- Type
要返回的对象的类型。
返回
一个对象,其类型为 conversionType
,并且其值等效于 value
。
- 或 -
如果 Nothing
为 value
,并且 null
不是值类型,则为空引用(在 Visual Basic 中为 conversionType
)。
例外
value
的格式不是 conversionType
可识别的格式。
value
表示不在 conversionType
的范围内的数字。
conversionType
上声明的默认值为 null
。
示例
下面的示例演示 ChangeType 方法的用法。
using namespace System;
int main()
{
Double d = -2.345;
int i = *safe_cast<Int32^>(Convert::ChangeType( d, int::typeid ));
Console::WriteLine( "The double value {0} when converted to an int becomes {1}", d, i );
String^ s = "12/12/98";
DateTime dt = *safe_cast<DateTime^>(Convert::ChangeType( s, DateTime::typeid ));
Console::WriteLine( "The string value {0} when converted to a Date becomes {1}", s, dt );
}
using System;
public class ChangeTypeTest {
public static void Main() {
Double d = -2.345;
int i = (int)Convert.ChangeType(d, typeof(int));
Console.WriteLine("The double value {0} when converted to an int becomes {1}", d, i);
string s = "12/12/98";
DateTime dt = (DateTime)Convert.ChangeType(s, typeof(DateTime));
Console.WriteLine("The string value {0} when converted to a Date becomes {1}", s, dt);
}
}
open System
let d = -2.345
let i = Convert.ChangeType(d, typeof<int>) :?> int
printfn $"The double value {d} when converted to an int becomes {i}"
let s = "12/12/98"
let dt = Convert.ChangeType(s, typeof<DateTime>) :?> DateTime
printfn $"The string value {s} when converted to a Date becomes {dt}"
Public Class ChangeTypeTest
Public Shared Sub Main()
Dim d As [Double] = - 2.345
Dim i As Integer = CInt(Convert.ChangeType(d, GetType(Integer)))
Console.WriteLine("The double value {0} when converted to an int becomes {1}", d, i)
Dim s As String = "12/12/98"
Dim dt As DateTime = CType(Convert.ChangeType(s, GetType(DateTime)), DateTime)
Console.WriteLine("The string value {0} when converted to a Date becomes {1}", s, dt)
End Sub
End Class
注解
ChangeType 是一种常规用途转换方法,用于将对象转换为 value
conversionType
。 该 value
参数可以是任何类型的对象, conversionType
也可以是 Type 表示任何基类型或自定义类型的对象。 若要成功转换, value
必须实现 IConvertible 接口,因为该方法只是包装对适当 IConvertible 方法的调用。 该方法要求支持转换value``conversionType
。
此方法使用当前线程的区域性进行转换。
调用方说明
该方法 ChangeType(Object, Type) 可以将枚举值转换为另一种类型。 但是,即使源类型是枚举的基础类型,它也无法将另一种类型转换为枚举值。 若要将类型转换为枚举值,请在 C#) 中使用强制转换运算符 (或Visual Basic) 中的转换函数 (。 以下示例演示了对 大陆
枚举值的转换。
:::code language=“csharp” source=“~/snippets/csharp/System/Convert/ChangeType/changetype_enum2.cs” interactive=“try-dotnet” id=“Snippet5”::: :::code language=“fsharp” source=“~/snippets/fsharp/System/Convert/ChangeType/changetype_enum2.fs” id=“Snippet5”::: ::code language=“vb” source=“~/snippets/visualbasic/VS_Snippets_CLR_System/system.convert.changetype/vb/changetype_enum2.vb” id=“Snippet5”::
该方法 ChangeType(Object, Type) 可以将可为 null 的类型转换为另一种类型。 但是,它无法将另一种类型转换为可为 null 类型的值,即使conversionType
它是基础类型的Nullable<T>值。若要执行转换,可以在 C#) 中使用强制转换运算符 (,也可以在 Visual Basic) 中使用转换函数 (。 以下示例演示了转换到 null 的类型和从 null 类型转换。
:::code language=“csharp” source=“~/snippets/csharp/System/Convert/ChangeType/changetype_nullable.cs” interactive=“try-dotnet” id=“Snippet7”::: :code language=“fsharp” source=“~/snippets/fsharp/System/Convert/ChangeType/changetype_nullable.fs” id=“Snippet7”::: ::code language=“vb” source=“~/snippets/visualbasic/VS_Snippets_CLR_System/system.convert.changetype/vb/changetype_nullable.vb” id=“Snippet7”::
适用于
ChangeType(Object, TypeCode)
返回指定类型的对象,其值等效于指定对象。
public:
static System::Object ^ ChangeType(System::Object ^ value, TypeCode typeCode);
public static object? ChangeType (object? value, TypeCode typeCode);
public static object ChangeType (object value, TypeCode typeCode);
static member ChangeType : obj * TypeCode -> obj
Public Shared Function ChangeType (value As Object, typeCode As TypeCode) As Object
参数
- value
- Object
一个实现 IConvertible 接口的对象。
- typeCode
- TypeCode
要返回的对象的类型。
返回
一个对象,其基础类型为 typeCode
,并且其值等效于 value
。
- 或 -
如果 Nothing
为 value
并且 null
为 typeCode
、Empty 或 String,则为空引用(在 Visual Basic 中为 Object)。
例外
value
的格式不是 typeCode
类型可识别的格式。
value
表示不在 typeCode
类型的范围内的数字。
typeCode
无效。
示例
以下示例演示了 ChangeType(Object, TypeCode) 如何使用该方法更改 Object 参数指定的 TypeCode 类型(如果可能)。
using namespace System;
void main()
{
Double d = -2.345;
int i = (int) Convert::ChangeType(d, TypeCode::Int32);
Console::WriteLine("The Double {0} when converted to an Int32 is {1}", d, i);
String^ s = "12/12/2009";
DateTime dt = (DateTime)Convert::ChangeType(s, DateTime::typeid);
Console::WriteLine("The String {0} when converted to a Date is {1}", s, dt);
}
// The example displays the following output:
// The Double -2.345 when converted to an Int32 is -2
// The String 12/12/2009 when converted to a Date is 12/12/2009 12:00:00 AM
using System;
public class ChangeTypeTest {
public static void Main() {
Double d = -2.345;
int i = (int)Convert.ChangeType(d, TypeCode.Int32);
Console.WriteLine("The Double {0} when converted to an Int32 is {1}", d, i);
string s = "12/12/2009";
DateTime dt = (DateTime)Convert.ChangeType(s, typeof(DateTime));
Console.WriteLine("The String {0} when converted to a Date is {1}", s, dt);
}
}
// The example displays the following output:
// The Double -2.345 when converted to an Int32 is -2
// The String 12/12/2009 when converted to a Date is 12/12/2009 12:00:00 AM
open System
let d = -2.345
let i = Convert.ChangeType(d, TypeCode.Int32) :?> int
printfn $"The Double {d} when converted to an Int32 is {i}"
let s = "12/12/2009"
let dt = Convert.ChangeType(s, typeof<DateTime>) :?> DateTime
printfn $"The String {s} when converted to a Date is {dt}"
// The example displays the following output:
// The Double -2.345 when converted to an Int32 is -2
// The String 12/12/2009 when converted to a Date is 12/12/2009 12:00:00 AM
Public Class ChangeTypeTest
Public Shared Sub Main()
Dim d As [Double] = - 2.345
Dim i As Integer = CInt(Convert.ChangeType(d, TypeCode.Int32))
Console.WriteLine("The Double {0} when converted to an Int32 is {1}", d, i)
Dim s As String = "12/12/2009"
Dim dt As DateTime = CDate(Convert.ChangeType(s, TypeCode.DateTime))
Console.WriteLine("The String {0} when converted to a Date is {1}", s, dt)
End Sub
End Class
' The example displays the following output:
' The Double -2.345 when converted to an Int32 is -2
' The String 12/12/2009 when converted to a Date is 12/12/2009 12:00:00 AM
注解
ChangeType(Object, TypeCode) 是一种常规用途转换方法,用于将指定的 value
对象转换为指定的 typeCode
预定义类型。 该 value
参数可以是任何类型的对象。 若要成功转换, value
必须实现 IConvertible 接口,因为该方法只是包装对适当 IConvertible 方法的调用。 该方法还需要 value
支持转换 typeCode
。
该方法 ChangeType(Object, TypeCode) 不支持转换为 value
自定义类型。 若要执行此类转换,请调用 ChangeType(Object, Type) 该方法。
适用于
ChangeType(Object, Type, IFormatProvider)
返回指定类型的对象,其值等效于指定对象。 参数提供区域性特定的格式设置信息。
public:
static System::Object ^ ChangeType(System::Object ^ value, Type ^ conversionType, IFormatProvider ^ provider);
public static object ChangeType (object value, Type conversionType, IFormatProvider provider);
public static object? ChangeType (object? value, Type conversionType, IFormatProvider? provider);
static member ChangeType : obj * Type * IFormatProvider -> obj
Public Shared Function ChangeType (value As Object, conversionType As Type, provider As IFormatProvider) As Object
参数
- value
- Object
一个实现 IConvertible 接口的对象。
- conversionType
- Type
要返回的对象的类型。
- provider
- IFormatProvider
一个提供区域性特定的格式设置信息的对象。
返回
一个对象,其类型为 conversionType
,并且其值等效于 value
。
- 或 -
value
,前提是 Type 的 value
和 conversionType
相等。
- 或 -
如果 Nothing
为 value
,并且 null
不是值类型,则为空引用(在 Visual Basic 中为 conversionType
)。
例外
value
的格式不是 provider
可识别的 conversionType
的格式。
value
表示不在 conversionType
的范围内的数字。
conversionType
上声明的默认值为 null
。
示例
下面的示例定义一个实现 Temperature
接口的 IConvertible 类。
using namespace System;
using namespace System::Globalization;
public ref class Temperature : IConvertible
{
private:
Decimal m_Temp;
public:
Temperature(Decimal temperature)
{
m_Temp = temperature;
}
property Decimal Celsius {
Decimal get() { return m_Temp; }
}
property Decimal Kelvin {
Decimal get() { return m_Temp + (Decimal) 273.15; }
}
property Decimal Fahrenheit {
Decimal get() { return Math::Round((Decimal) (m_Temp * 9 / 5 + 32), 2); }
}
virtual String^ ToString()
override {
return m_Temp.ToString("N2") + "�C";
}
// IConvertible implementations.
virtual TypeCode GetTypeCode()
{
return TypeCode::Object;
}
virtual bool ToBoolean(IFormatProvider^ provider)
{
if (m_Temp == 0)
return false;
else
return true;
}
virtual Byte ToByte(IFormatProvider^ provider)
{
if (m_Temp < Byte::MinValue || m_Temp > Byte::MaxValue)
throw gcnew OverflowException(String::Format("{0} is out of range of the Byte type.",
m_Temp));
else
return Decimal::ToByte(m_Temp);
}
virtual Char ToChar(IFormatProvider^ provider)
{
throw gcnew InvalidCastException("Temperature to Char conversion is not supported.");
}
virtual DateTime ToDateTime(IFormatProvider^ provider)
{
throw gcnew InvalidCastException("Temperature to DateTime conversion is not supported.");
}
virtual Decimal ToDecimal(IFormatProvider^ provider)
{
return m_Temp;
}
virtual Double ToDouble(IFormatProvider^ provider)
{
return Decimal::ToDouble(m_Temp);
}
virtual Int16 ToInt16(IFormatProvider^ provider)
{
if (m_Temp < Int16::MinValue || m_Temp > Int16::MaxValue)
throw gcnew OverflowException(String::Format("{0} is out of range of the Int16 type.",
m_Temp));
else
return Decimal::ToInt16(m_Temp);
}
virtual Int32 ToInt32(IFormatProvider^ provider)
{
if (m_Temp < Int32::MinValue || m_Temp > Int32::MaxValue)
throw gcnew OverflowException(String::Format("{0} is out of range of the Int32 type.",
m_Temp));
else
return Decimal::ToInt32(m_Temp);
}
virtual Int64 ToInt64(IFormatProvider^ provider)
{
if (m_Temp < Int64::MinValue || m_Temp > Int64::MaxValue)
throw gcnew OverflowException(String::Format("{0} is out of range of the Int64 type.",
m_Temp));
else
return Decimal::ToInt64(m_Temp);
}
virtual SByte ToSByte(IFormatProvider^ provider)
{
if (m_Temp < SByte::MinValue || m_Temp > SByte::MaxValue)
throw gcnew OverflowException(String::Format("{0} is out of range of the SByte type.",
m_Temp));
else
return Decimal::ToSByte(m_Temp);
}
virtual Single ToSingle(IFormatProvider^ provider)
{
return Decimal::ToSingle(m_Temp);
}
virtual String^ ToString(IFormatProvider^ provider)
{
return m_Temp.ToString("N2", provider) + "�C";
}
virtual Object^ ToType(Type^ conversionType, IFormatProvider^ provider)
{
switch (Type::GetTypeCode(conversionType))
{
case TypeCode::Boolean:
return ToBoolean(nullptr);
case TypeCode::Byte:
return ToByte(nullptr);
case TypeCode::Char:
return ToChar(nullptr);
case TypeCode::DateTime:
return ToDateTime(nullptr);
case TypeCode::Decimal:
return ToDecimal(nullptr);
case TypeCode::Double:
return ToDouble(nullptr);
case TypeCode::Int16:
return ToInt16(nullptr);
case TypeCode::Int32:
return ToInt32(nullptr);
case TypeCode::Int64:
return ToInt64(nullptr);
case TypeCode::Object:
if (Temperature::typeid->Equals(conversionType))
return this;
else
throw gcnew InvalidCastException(String::Format("Conversion to a {0} is not supported.",
conversionType->Name));
case TypeCode::SByte:
return ToSByte(nullptr);
case TypeCode::Single:
return ToSingle(nullptr);
case TypeCode::String:
return ToString(provider);
case TypeCode::UInt16:
return ToUInt16(nullptr);
case TypeCode::UInt32:
return ToUInt32(nullptr);
case TypeCode::UInt64:
return ToUInt64(nullptr);
default:
throw gcnew InvalidCastException(String::Format("Conversion to {0} is not supported.", conversionType->Name));
}
}
virtual UInt16 ToUInt16(IFormatProvider^ provider)
{
if (m_Temp < UInt16::MinValue || m_Temp > UInt16::MaxValue)
throw gcnew OverflowException(String::Format("{0} is out of range of the UInt16 type.",
m_Temp));
else
return Decimal::ToUInt16(m_Temp);
}
virtual UInt32 ToUInt32(IFormatProvider^ provider)
{
if (m_Temp < UInt32::MinValue || m_Temp > UInt32::MaxValue)
throw gcnew OverflowException(String::Format("{0} is out of range of the UInt32 type.",
m_Temp));
else
return Decimal::ToUInt32(m_Temp);
}
virtual UInt64 ToUInt64(IFormatProvider^ provider)
{
if (m_Temp < UInt64::MinValue || m_Temp > UInt64::MaxValue)
throw gcnew OverflowException(String::Format("{0} is out of range of the UInt64 type.",
m_Temp));
else
return Decimal::ToUInt64(m_Temp);
}
};
using System;
using System.Globalization;
public class Temperature : IConvertible
{
private decimal m_Temp;
public Temperature(decimal temperature)
{
this.m_Temp = temperature;
}
public decimal Celsius
{
get { return this.m_Temp; }
}
public decimal Kelvin
{
get { return this.m_Temp + 273.15m; }
}
public decimal Fahrenheit
{
get { return Math.Round((decimal) (this.m_Temp * 9 / 5 + 32), 2); }
}
public override string ToString()
{
return m_Temp.ToString("N2") + "°C";
}
// IConvertible implementations.
public TypeCode GetTypeCode()
{
return TypeCode.Object;
}
public bool ToBoolean(IFormatProvider provider)
{
if (m_Temp == 0)
return false;
else
return true;
}
public byte ToByte(IFormatProvider provider)
{
if (m_Temp < Byte.MinValue || m_Temp > Byte.MaxValue)
throw new OverflowException(String.Format("{0} is out of range of the Byte type.",
this.m_Temp));
else
return Decimal.ToByte(this.m_Temp);
}
public char ToChar(IFormatProvider provider)
{
throw new InvalidCastException("Temperature to Char conversion is not supported.");
}
public DateTime ToDateTime(IFormatProvider provider)
{
throw new InvalidCastException("Temperature to DateTime conversion is not supported.");
}
public decimal ToDecimal(IFormatProvider provider)
{
return this.m_Temp;
}
public double ToDouble(IFormatProvider provider)
{
return Decimal.ToDouble(this.m_Temp);
}
public short ToInt16(IFormatProvider provider)
{
if (this.m_Temp < Int16.MinValue || this.m_Temp > Int16.MaxValue)
throw new OverflowException(String.Format("{0} is out of range of the Int16 type.",
this.m_Temp));
else
return Decimal.ToInt16(this.m_Temp);
}
public int ToInt32(IFormatProvider provider)
{
if (this.m_Temp < Int32.MinValue || this.m_Temp > Int32.MaxValue)
throw new OverflowException(String.Format("{0} is out of range of the Int32 type.",
this.m_Temp));
else
return Decimal.ToInt32(this.m_Temp);
}
public long ToInt64(IFormatProvider provider)
{
if (this.m_Temp < Int64.MinValue || this.m_Temp > Int64.MaxValue)
throw new OverflowException(String.Format("{0} is out of range of the Int64 type.",
this.m_Temp));
else
return Decimal.ToInt64(this.m_Temp);
}
public sbyte ToSByte(IFormatProvider provider)
{
if (this.m_Temp < SByte.MinValue || this.m_Temp > SByte.MaxValue)
throw new OverflowException(String.Format("{0} is out of range of the SByte type.",
this.m_Temp));
else
return Decimal.ToSByte(this.m_Temp);
}
public float ToSingle(IFormatProvider provider)
{
return Decimal.ToSingle(this.m_Temp);
}
public string ToString(IFormatProvider provider)
{
return m_Temp.ToString("N2", provider) + "°C";
}
public object ToType(Type conversionType, IFormatProvider provider)
{
switch (Type.GetTypeCode(conversionType))
{
case TypeCode.Boolean:
return this.ToBoolean(null);
case TypeCode.Byte:
return this.ToByte(null);
case TypeCode.Char:
return this.ToChar(null);
case TypeCode.DateTime:
return this.ToDateTime(null);
case TypeCode.Decimal:
return this.ToDecimal(null);
case TypeCode.Double:
return this.ToDouble(null);
case TypeCode.Int16:
return this.ToInt16(null);
case TypeCode.Int32:
return this.ToInt32(null);
case TypeCode.Int64:
return this.ToInt64(null);
case TypeCode.Object:
if (typeof(Temperature).Equals(conversionType))
return this;
else
throw new InvalidCastException(String.Format("Conversion to a {0} is not supported.",
conversionType.Name));
case TypeCode.SByte:
return this.ToSByte(null);
case TypeCode.Single:
return this.ToSingle(null);
case TypeCode.String:
return this.ToString(provider);
case TypeCode.UInt16:
return this.ToUInt16(null);
case TypeCode.UInt32:
return this.ToUInt32(null);
case TypeCode.UInt64:
return this.ToUInt64(null);
default:
throw new InvalidCastException(String.Format("Conversion to {0} is not supported.", conversionType.Name));
}
}
public ushort ToUInt16(IFormatProvider provider)
{
if (this.m_Temp < UInt16.MinValue || this.m_Temp > UInt16.MaxValue)
throw new OverflowException(String.Format("{0} is out of range of the UInt16 type.",
this.m_Temp));
else
return Decimal.ToUInt16(this.m_Temp);
}
public uint ToUInt32(IFormatProvider provider)
{
if (this.m_Temp < UInt32.MinValue || this.m_Temp > UInt32.MaxValue)
throw new OverflowException(String.Format("{0} is out of range of the UInt32 type.",
this.m_Temp));
else
return Decimal.ToUInt32(this.m_Temp);
}
public ulong ToUInt64(IFormatProvider provider)
{
if (this.m_Temp < UInt64.MinValue || this.m_Temp > UInt64.MaxValue)
throw new OverflowException(String.Format("{0} is out of range of the UInt64 type.",
this.m_Temp));
else
return Decimal.ToUInt64(this.m_Temp);
}
}
open System
open System.Globalization
type Temperature(temperature: decimal) =
member _.Celsius = temperature
member _.Kelvin =
temperature + 273.15m
member _.Fahrenheit =
Math.Round(decimal (temperature * 9m / 5m + 32m), 2)
override _.ToString() =
temperature.ToString "N2" + "°C"
// IConvertible implementations.
interface IConvertible with
member _.GetTypeCode() =
TypeCode.Object
member _.ToBoolean(provider: IFormatProvider) =
temperature <> 0M
member _.ToByte(provider: IFormatProvider) =
if temperature < decimal Byte.MinValue || temperature > decimal Byte.MaxValue then
raise (OverflowException $"{temperature} is out of range of the Byte type.")
else
Decimal.ToByte temperature
member _.ToChar(provider: IFormatProvider) =
raise (InvalidCastException "Temperature to Char conversion is not supported.")
member _.ToDateTime(provider: IFormatProvider) =
raise (InvalidCastException "Temperature to DateTime conversion is not supported.")
member _.ToDecimal(provider: IFormatProvider) =
temperature
member _.ToDouble(provider: IFormatProvider) =
Decimal.ToDouble temperature
member _.ToInt16(provider: IFormatProvider) =
if temperature < decimal Int16.MinValue || temperature > decimal Int16.MaxValue then
raise (OverflowException $"{temperature} is out of range of the Int16 type.")
else
Decimal.ToInt16 temperature
member _.ToInt32(provider: IFormatProvider) =
if temperature < decimal Int32.MinValue || temperature > decimal Int32.MaxValue then
raise (OverflowException $"{temperature} is out of range of the Int32 type.")
else
Decimal.ToInt32 temperature
member _.ToInt64(provider: IFormatProvider) =
if temperature < decimal Int64.MinValue || temperature > decimal Int64.MaxValue then
raise (OverflowException $"{temperature} is out of range of the Int64 type.")
else
Decimal.ToInt64 temperature
member _.ToSByte(provider: IFormatProvider) =
if temperature < decimal SByte.MinValue || temperature > decimal SByte.MaxValue then
raise (OverflowException $"{temperature} is out of range of the SByte type.")
else
Decimal.ToSByte temperature
member _.ToSingle(provider: IFormatProvider) =
Decimal.ToSingle temperature
member _.ToString(provider: IFormatProvider) =
temperature.ToString("N2", provider) + "°C"
member this.ToType(conversionType: Type, provider: IFormatProvider) =
let this = this :> IConvertible
match Type.GetTypeCode conversionType with
| TypeCode.Boolean->
this.ToBoolean null
| TypeCode.Byte ->
this.ToByte null
| TypeCode.Char ->
this.ToChar null
| TypeCode.DateTime ->
this.ToDateTime null
| TypeCode.Decimal ->
this.ToDecimal null
| TypeCode.Double ->
this.ToDouble null
| TypeCode.Int16 ->
this.ToInt16 null
| TypeCode.Int32 ->
this.ToInt32 null
| TypeCode.Int64 ->
this.ToInt64 null
| TypeCode.Object ->
if typeof<Temperature>.Equals conversionType then
this
else
raise (InvalidCastException $"Conversion to a {conversionType.Name} is not supported.")
| TypeCode.SByte ->
this.ToSByte null
| TypeCode.Single ->
this.ToSingle null
| TypeCode.String ->
this.ToString provider
| TypeCode.UInt16 ->
this.ToUInt16 null
| TypeCode.UInt32->
this.ToUInt32 null
| TypeCode.UInt64->
this.ToUInt64 null
| _ ->
raise (InvalidCastException $"Conversion to {conversionType.Name} is not supported.")
member _.ToUInt16(provider: IFormatProvider) =
if temperature < decimal UInt16.MinValue || temperature > decimal UInt16.MaxValue then
raise (OverflowException $"{temperature} is out of range of the UInt16 type.")
else
Decimal.ToUInt16 temperature
member _.ToUInt32(provider: IFormatProvider) =
if temperature < decimal UInt32.MinValue || temperature > decimal UInt32.MaxValue then
raise (OverflowException $"{temperature} is out of range of the UInt32 type.")
else
Decimal.ToUInt32 temperature
member _.ToUInt64(provider: IFormatProvider) =
if temperature < decimal UInt64.MinValue || temperature > decimal UInt64.MaxValue then
raise (OverflowException $"{temperature} is out of range of the UInt64 type.")
else
Decimal.ToUInt64 temperature
Imports System.Globalization
Public Class Temperature : Implements IConvertible
Private m_Temp As Decimal
Public Sub New(temperature As Decimal)
Me.m_Temp = temperature
End Sub
Public ReadOnly Property Celsius() As Decimal
Get
Return Me.m_Temp
End Get
End Property
Public ReadOnly Property Kelvin() As Decimal
Get
Return Me.m_Temp + 273.15d
End Get
End Property
Public ReadOnly Property Fahrenheit() As Decimal
Get
Return Math.Round(CDec(Me.m_Temp * 9 / 5 + 32), 2)
End Get
End Property
Public Overrides Function ToString() As String
Return m_Temp.ToString("N2") & "°C"
End Function
' IConvertible implementations.
Public Function GetTypeCode() As TypeCode _
Implements IConvertible.GetTypeCode
Return TypeCode.Object
End Function
Public Function ToBoolean(provider As IFormatProvider) As Boolean _
Implements IConvertible.ToBoolean
If m_Temp = 0 Then
Return False
Else
Return True
End If
End Function
Public Function ToByte(provider As IFormatProvider) As Byte _
Implements IConvertible.ToByte
If m_Temp < Byte.MinValue Or m_Temp > Byte.MaxValue Then
Throw New OverflowException(String.Format("{0} is out of range of the Byte type.", _
Me.m_Temp))
Else
Return Decimal.ToByte(Me.m_Temp)
End If
End Function
Public Function ToChar(provider As IFormatProvider) As Char _
Implements IConvertible.ToChar
Throw New InvalidCastException("Temperature to Char conversion is not supported.")
End Function
Public Function ToDateTime(provider As IFormatProvider) As Date _
Implements IConvertible.ToDateTime
Throw New InvalidCastException("Temperature to DateTime conversion is not supported.")
End Function
Public Function ToDecimal(provider As IFormatProvider) As Decimal _
Implements IConvertible.ToDecimal
Return Me.m_Temp
End Function
Public Function ToDouble(provider As IFormatProvider) As Double _
Implements IConvertible.ToDouble
Return Decimal.ToDouble(Me.m_Temp)
End Function
Public Function ToInt16(provider As IFormatProvider) As Int16 _
Implements IConvertible.ToInt16
If Me.m_Temp < Int16.MinValue Or Me.m_Temp > Int16.MaxValue Then
Throw New OverflowException(String.Format("{0} is out of range of the Int16 type.", _
Me.m_Temp))
Else
Return Decimal.ToInt16(Me.m_Temp)
End If
End Function
Public Function ToInt32(provider As IFormatProvider) As Int32 _
Implements IConvertible.ToInt32
If Me.m_Temp < Int32.MinValue Or Me.m_Temp > Int32.MaxValue Then
Throw New OverflowException(String.Format("{0} is out of range of the Int32 type.", _
Me.m_Temp))
Else
Return Decimal.ToInt32(Me.m_Temp)
End If
End Function
Public Function ToInt64(provider As IFormatProvider) As Int64 _
Implements IConvertible.ToInt64
If Me.m_Temp < Int64.MinValue Or Me.m_Temp > Int64.MaxValue Then
Throw New OverflowException(String.Format("{0} is out of range of the Int64 type.", _
Me.m_Temp))
Else
Return Decimal.ToInt64(Me.m_Temp)
End If
End Function
Public Function ToSByte(provider As IFormatProvider) As SByte _
Implements IConvertible.ToSByte
If Me.m_Temp < SByte.MinValue Or Me.m_Temp > SByte.MaxValue Then
Throw New OverflowException(String.Format("{0} is out of range of the SByte type.", _
Me.m_Temp))
Else
Return Decimal.ToSByte(Me.m_Temp)
End If
End Function
Public Function ToSingle(provider As IFormatProvider) As Single _
Implements IConvertible.ToSingle
Return Decimal.ToSingle(Me.m_Temp)
End Function
Public Overloads Function ToString(provider As IFormatProvider) As String _
Implements IConvertible.ToString
Return m_Temp.ToString("N2", provider) & "°C"
End Function
Public Function ToType(conversionType As Type, provider As IFormatProvider) As Object _
Implements IConvertible.ToType
Select Case Type.GetTypeCode(conversionType)
Case TypeCode.Boolean
Return Me.ToBoolean(Nothing)
Case TypeCode.Byte
Return Me.ToByte(Nothing)
Case TypeCode.Char
Return Me.ToChar(Nothing)
Case TypeCode.DateTime
Return Me.ToDateTime(Nothing)
Case TypeCode.Decimal
Return Me.ToDecimal(Nothing)
Case TypeCode.Double
Return Me.ToDouble(Nothing)
Case TypeCode.Int16
Return Me.ToInt16(Nothing)
Case TypeCode.Int32
Return Me.ToInt32(Nothing)
Case TypeCode.Int64
Return Me.ToInt64(Nothing)
Case TypeCode.Object
If GetType(Temperature).Equals(conversionType) Then
Return Me
Else
Throw New InvalidCastException(String.Format("Conversion to a {0} is not supported.", _
conversionType.Name))
End If
Case TypeCode.SByte
Return Me.ToSByte(Nothing)
Case TypeCode.Single
Return Me.ToSingle(Nothing)
Case TypeCode.String
Return Me.ToString(provider)
Case TypeCode.UInt16
Return Me.ToUInt16(Nothing)
Case TypeCode.UInt32
Return Me.ToUInt32(Nothing)
Case TypeCode.UInt64
Return Me.ToUInt64(Nothing)
Case Else
Throw New InvalidCastException(String.Format("Conversion to {0} is not supported.", conversionType.Name))
End Select
End Function
Public Function ToUInt16(provider As IFormatProvider) As UInt16 _
Implements IConvertible.ToUInt16
If Me.m_Temp < UInt16.MinValue Or Me.m_Temp > UInt16.MaxValue Then
Throw New OverflowException(String.Format("{0} is out of range of the UInt16 type.", _
Me.m_Temp))
Else
Return Decimal.ToUInt16(Me.m_Temp)
End If
End Function
Public Function ToUInt32(provider As IFormatProvider) As UInt32 _
Implements IConvertible.ToUInt32
If Me.m_Temp < UInt32.MinValue Or Me.m_Temp > UInt32.MaxValue Then
Throw New OverflowException(String.Format("{0} is out of range of the UInt32 type.", _
Me.m_Temp))
Else
Return Decimal.ToUInt32(Me.m_Temp)
End If
End Function
Public Function ToUInt64(provider As IFormatProvider) As UInt64 _
Implements IConvertible.ToUInt64
If Me.m_Temp < UInt64.MinValue Or Me.m_Temp > UInt64.MaxValue Then
Throw New OverflowException(String.Format("{0} is out of range of the UInt64 type.", _
Me.m_Temp))
Else
Return Decimal.ToUInt64(Me.m_temp)
End If
End Function
End Class
以下示例创建类的 Temperature
实例,并调用 ChangeType(Object, Type, IFormatProvider) 该方法以将其转换为 .NET 支持的基本数值类型,并将其转换为 a String。 它说明该方法 ChangeType 包装对源类型实现的 IConvertible 调用。
void main()
{
Temperature^ cool = gcnew Temperature(5);
array<Type^>^ targetTypes = gcnew array<Type^> { SByte::typeid, Int16::typeid, Int32::typeid,
Int64::typeid, Byte::typeid, UInt16::typeid,
UInt32::typeid, UInt64::typeid, Decimal::typeid,
Single::typeid, Double::typeid, String::typeid };
CultureInfo^ provider = gcnew CultureInfo("fr-FR");
for each (Type^ targetType in targetTypes)
{
try {
Object^ value = Convert::ChangeType(cool, targetType, provider);
Console::WriteLine("Converted {0} {1} to {2} {3}.",
cool->GetType()->Name, cool->ToString(),
targetType->Name, value);
}
catch (InvalidCastException^) {
Console::WriteLine("Unsupported {0} --> {1} conversion.",
cool->GetType()->Name, targetType->Name);
}
catch (OverflowException^) {
Console::WriteLine("{0} is out of range of the {1} type.",
cool, targetType->Name);
}
}
}
// The example dosplays the following output:
// Converted Temperature 5.00�C to SByte 5.
// Converted Temperature 5.00�C to Int16 5.
// Converted Temperature 5.00�C to Int32 5.
// Converted Temperature 5.00�C to Int64 5.
// Converted Temperature 5.00�C to Byte 5.
// Converted Temperature 5.00�C to UInt16 5.
// Converted Temperature 5.00�C to UInt32 5.
// Converted Temperature 5.00�C to UInt64 5.
// Converted Temperature 5.00�C to Decimal 5.
// Converted Temperature 5.00�C to Single 5.
// Converted Temperature 5.00�C to Double 5.
// Converted Temperature 5.00�C to String 5,00�C.
public class Example
{
public static void Main()
{
Temperature cool = new Temperature(5);
Type[] targetTypes = { typeof(SByte), typeof(Int16), typeof(Int32),
typeof(Int64), typeof(Byte), typeof(UInt16),
typeof(UInt32), typeof(UInt64), typeof(Decimal),
typeof(Single), typeof(Double), typeof(String) };
CultureInfo provider = new CultureInfo("fr-FR");
foreach (Type targetType in targetTypes)
{
try {
object value = Convert.ChangeType(cool, targetType, provider);
Console.WriteLine("Converted {0} {1} to {2} {3}.",
cool.GetType().Name, cool.ToString(),
targetType.Name, value);
}
catch (InvalidCastException) {
Console.WriteLine("Unsupported {0} --> {1} conversion.",
cool.GetType().Name, targetType.Name);
}
catch (OverflowException) {
Console.WriteLine("{0} is out of range of the {1} type.",
cool, targetType.Name);
}
}
}
}
// The example dosplays the following output:
// Converted Temperature 5.00°C to SByte 5.
// Converted Temperature 5.00°C to Int16 5.
// Converted Temperature 5.00°C to Int32 5.
// Converted Temperature 5.00°C to Int64 5.
// Converted Temperature 5.00°C to Byte 5.
// Converted Temperature 5.00°C to UInt16 5.
// Converted Temperature 5.00°C to UInt32 5.
// Converted Temperature 5.00°C to UInt64 5.
// Converted Temperature 5.00°C to Decimal 5.
// Converted Temperature 5.00°C to Single 5.
// Converted Temperature 5.00°C to Double 5.
// Converted Temperature 5.00°C to String 5,00°C.
let cool = Temperature 5
let targetTypes =
[ typeof<SByte>; typeof<Int16>; typeof<Int32>
typeof<Int64>; typeof<Byte>; typeof<UInt16>
typeof<UInt32>; typeof<UInt64>; typeof<Decimal>;
typeof<Single>; typeof<Double>; typeof<String>; ]
let provider = CultureInfo "fr-FR"
for targetType in targetTypes do
try
let value = Convert.ChangeType(cool, targetType, provider)
printfn $"Converted {cool.GetType().Name} {cool} to {targetType.Name} {value}."
with
| :? InvalidCastException ->
printfn $"Unsupported {cool.GetType().Name} --> {targetType.Name} conversion."
| :? OverflowException ->
printfn $"{cool} is out of range of the {targetType.Name} type."
// The example dosplays the following output:
// Converted Temperature 5.00°C to SByte 5.
// Converted Temperature 5.00°C to Int16 5.
// Converted Temperature 5.00°C to Int32 5.
// Converted Temperature 5.00°C to Int64 5.
// Converted Temperature 5.00°C to Byte 5.
// Converted Temperature 5.00°C to UInt16 5.
// Converted Temperature 5.00°C to UInt32 5.
// Converted Temperature 5.00°C to UInt64 5.
// Converted Temperature 5.00°C to Decimal 5.
// Converted Temperature 5.00°C to Single 5.
// Converted Temperature 5.00°C to Double 5.
// Converted Temperature 5.00°C to String 5,00°C.
Module Example
Public Sub Main()
Dim cool As New Temperature(5)
Dim targetTypes() As Type = { GetType(SByte), GetType(Int16), GetType(Int32), _
GetType(Int64), GetType(Byte), GetType(UInt16), _
GetType(UInt32), GetType(UInt64), GetType(Decimal), _
GetType(Single), GetType(Double), GetType(String) }
Dim provider As New CultureInfo("fr-FR")
For Each targetType As Type In targetTypes
Try
Dim value As Object = Convert.ChangeType(cool, targetType, provider)
Console.WriteLine("Converted {0} {1} to {2} {3}.", _
cool.GetType().Name, cool.ToString(), _
targetType.Name, value)
Catch e As InvalidCastException
Console.WriteLine("Unsupported {0} --> {1} conversion.", _
cool.GetType().Name, targetType.Name)
Catch e As OverflowException
Console.WriteLine("{0} is out of range of the {1} type.", _
cool, targetType.Name)
End Try
Next
End Sub
End Module
' The example displays the following output:
' Converted Temperature 5.00°C to SByte 5.
' Converted Temperature 5.00°C to Int16 5.
' Converted Temperature 5.00°C to Int32 5.
' Converted Temperature 5.00°C to Int64 5.
' Converted Temperature 5.00°C to Byte 5.
' Converted Temperature 5.00°C to UInt16 5.
' Converted Temperature 5.00°C to UInt32 5.
' Converted Temperature 5.00°C to UInt64 5.
' Converted Temperature 5.00°C to Decimal 5.
' Converted Temperature 5.00°C to Single 5.
' Converted Temperature 5.00°C to Double 5.
' Converted Temperature 5.00°C to String 5,00°C.
注解
ChangeType 是一种常规用途转换方法,用于将对象 value
转换为 conversionType
。 该 value
参数可以是任何类型的对象, conversionType
也可以是表示 Type 任何基类型或自定义类型的对象。 若要成功转换, value
必须实现 IConvertible 接口,因为该方法只是包装对适当 IConvertible 方法的调用。 该方法要求 value
转换支持 conversionType
。
该 provider
参数是一个 IFormatProvider 实现,它提供转换的格式设置信息。 是否以及如何使用此参数取决于基础 IConvertible 实现。 如果 value
为基数据类型, provider
则仅用于以下转换:
从数字转换为字符串,或从字符串转换为数字。
provider
必须是返回 CultureInfo 对象的对象、 NumberFormatInfo 对象或自定义 IFormatProvider 实现 NumberFormatInfo 。 但是,由于ChangeType(Object, TypeCode, IFormatProvider)该方法使用默认的“G”格式说明符执行转换,因此如果value
或目标类型为无符号整数,参数provider
将不起作用。null
如果是provider
,CultureInfo则使用表示当前区域性的对象。从 DateTime 值转换为字符串,或从字符串转换为 DateTime 值。
provider
必须是或CultureInfoDateTimeFormatInfo对象。null
如果是provider
,CultureInfo则使用表示当前区域性的对象。
如果 value
为应用程序定义类型,则其 IConvertible 实现可以使用 provider
参数。
调用方说明
该方法 ChangeType(Object, Type, IFormatProvider) 可以将枚举值转换为另一种类型。 但是,即使源类型是枚举的基础类型,它也无法将另一种类型转换为枚举值。 若要将类型转换为枚举值,请在 C#) 中使用强制转换运算符 (或Visual Basic) 中的转换函数 (。 以下示例演示了对 大陆
枚举值的转换。
:::code language=“csharp” source=“~/snippets/csharp/System/Convert/ChangeType/changetype_enum2.cs” interactive=“try-dotnet” id=“Snippet5”::: :::code language=“fsharp” source=“~/snippets/fsharp/System/Convert/ChangeType/changetype_enum2.fs” id=“Snippet5”::: ::code language=“vb” source=“~/snippets/visualbasic/VS_Snippets_CLR_System/system.convert.changetype/vb/changetype_enum2.vb” id=“Snippet5”::
该方法 ChangeType(Object, Type, IFormatProvider) 可以将可为 null 的类型转换为另一种类型。 但是,它无法将另一种类型转换为可为 null 类型的值,即使 conversionType
它是基础类型的 Nullable<T>值。 若要执行转换,可以在 C#) 中使用强制转换运算符 (,也可以在 Visual Basic) 中使用转换函数 (。 以下示例演示了转换到 null 的类型和从 null 类型转换。
:::code language=“csharp” source=“~/snippets/csharp/System/Convert/ChangeType/changetype_nullable_1.cs” interactive=“try-dotnet” id=“Snippet8”::: :::code language=“fsharp” source=“~/snippets/fsharp/System /Convert/ChangeType/changetype_nullable_1.fs” id=“Snippet8”:::: ::code language=“vb” source=“~/snippets/visualbasic/VS_Snippets_CLR_System/system.convert.changetype/vb/changetype_nullable_1.vb” id=“Snippet8”::
适用于
ChangeType(Object, TypeCode, IFormatProvider)
返回指定类型的对象,其值等效于指定对象。 参数提供区域性特定的格式设置信息。
public:
static System::Object ^ ChangeType(System::Object ^ value, TypeCode typeCode, IFormatProvider ^ provider);
public static object ChangeType (object value, TypeCode typeCode, IFormatProvider provider);
public static object? ChangeType (object? value, TypeCode typeCode, IFormatProvider? provider);
static member ChangeType : obj * TypeCode * IFormatProvider -> obj
Public Shared Function ChangeType (value As Object, typeCode As TypeCode, provider As IFormatProvider) As Object
参数
- value
- Object
一个实现 IConvertible 接口的对象。
- typeCode
- TypeCode
要返回的对象的类型。
- provider
- IFormatProvider
一个提供区域性特定的格式设置信息的对象。
返回
一个对象,其基础类型为 typeCode
,并且其值等效于 value
。
- 或 -
如果 Nothing
为 value
并且 null
为 typeCode
、Empty 或 String,则为空引用(在 Visual Basic 中为 Object)。
例外
value
的格式不是 provider
可识别的 typeCode
类型的格式。
value
表示不在 typeCode
类型的范围内的数字。
typeCode
无效。
示例
以下示例定义一个自定义格式提供程序,该提供程序命名 InterceptProvider
指示何时调用该方法 GetFormat ,并返回 NumberFormatInfo fr-FR 区域性和 DateTimeFormatInfo en-US 区域性的对象。 此格式提供程序用于对该方法的所有调用 ChangeType(Object, TypeCode, IFormatProvider) 。 然后,该示例创建一个数组,其中包含一Double个值和一个DateTime值,并针对每个值和枚举的每个成员TypeCode进行重复调用ChangeType(Object, TypeCode, IFormatProvider)。 该示例演示了该方法何时使用 IFormatProvider 参数,并说明了如何使用 provider
参数来执行区分区域性的格式。
using namespace System;
using namespace System::Globalization;
ref class InterceptProvider : IFormatProvider
{
public:
virtual Object^ GetFormat(Type^ formatType)
{
CultureInfo^ culture;
if (formatType == NumberFormatInfo::typeid) {
Console::WriteLine(" Returning a fr-FR numeric format provider.");
culture = gcnew CultureInfo("fr-FR");
return culture->NumberFormat;
}
else if (formatType == DateTimeFormatInfo::typeid) {
Console::WriteLine(" Returning an en-US date/time format provider.");
culture = gcnew CultureInfo("en-US");
return culture->DateTimeFormat;
}
else {
Console::WriteLine(" Requesting a format provider of {0}.", formatType->Name);
return nullptr;
}
}
};
void main()
{
array<Object^>^ values = gcnew array<Object^> { 103.5, gcnew DateTime(2010, 12, 26, 14, 34, 0) };
IFormatProvider^ provider = gcnew InterceptProvider();
// Convert value to each of the types represented in TypeCode enum.
for each (Object^ value in values)
{
// Iterate types in TypeCode enum.
for each (TypeCode enumType in (array<TypeCode>^) Enum::GetValues(TypeCode::typeid))
{
if (enumType == TypeCode::DBNull || enumType == TypeCode::Empty) continue;
try {
Console::WriteLine("{0} ({1}) --> {2} ({3}).",
value, value->GetType()->Name,
Convert::ChangeType(value, enumType, provider),
enumType.ToString());
}
catch (InvalidCastException^ e) {
Console::WriteLine("Cannot convert a {0} to a {1}",
value->GetType()->Name, enumType.ToString());
}
catch (OverflowException^ e) {
Console::WriteLine("Overflow: {0} is out of the range of a {1}",
value, enumType.ToString());
}
}
Console::WriteLine();
}
}
// The example displays the following output:
// 103.5 (Double) --> 103.5 (Object).
// 103.5 (Double) --> True (Boolean).
// Cannot convert a Double to a Char
// 103.5 (Double) --> 104 (SByte).
// 103.5 (Double) --> 104 (Byte).
// 103.5 (Double) --> 104 (Int16).
// 103.5 (Double) --> 104 (UInt16).
// 103.5 (Double) --> 104 (Int32).
// 103.5 (Double) --> 104 (UInt32).
// 103.5 (Double) --> 104 (Int64).
// 103.5 (Double) --> 104 (UInt64).
// 103.5 (Double) --> 103.5 (Single).
// 103.5 (Double) --> 103.5 (Double).
// 103.5 (Double) --> 103.5 (Decimal).
// Cannot convert a Double to a DateTime
// Returning a fr-FR numeric format provider.
// 103.5 (Double) --> 103,5 (String).
//
// 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (Object).
// Cannot convert a DateTime to a Boolean
// Cannot convert a DateTime to a Char
// Cannot convert a DateTime to a SByte
// Cannot convert a DateTime to a Byte
// Cannot convert a DateTime to a Int16
// Cannot convert a DateTime to a UInt16
// Cannot convert a DateTime to a Int32
// Cannot convert a DateTime to a UInt32
// Cannot convert a DateTime to a Int64
// Cannot convert a DateTime to a UInt64
// Cannot convert a DateTime to a Single
// Cannot convert a DateTime to a Double
// Cannot convert a DateTime to a Decimal
// 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (DateTime).
// Returning an en-US date/time format provider.
// 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (String).
using System;
using System.Globalization;
public class InterceptProvider : IFormatProvider
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(NumberFormatInfo)) {
Console.WriteLine(" Returning a fr-FR numeric format provider.");
return new System.Globalization.CultureInfo("fr-FR").NumberFormat;
}
else if (formatType == typeof(DateTimeFormatInfo)) {
Console.WriteLine(" Returning an en-US date/time format provider.");
return new System.Globalization.CultureInfo("en-US").DateTimeFormat;
}
else {
Console.WriteLine(" Requesting a format provider of {0}.", formatType.Name);
return null;
}
}
}
public class Example
{
public static void Main()
{
object[] values = { 103.5d, new DateTime(2010, 12, 26, 14, 34, 0) };
IFormatProvider provider = new InterceptProvider();
// Convert value to each of the types represented in TypeCode enum.
foreach (object value in values)
{
// Iterate types in TypeCode enum.
foreach (TypeCode enumType in ((TypeCode[]) Enum.GetValues(typeof(TypeCode))))
{
if (enumType == TypeCode.DBNull || enumType == TypeCode.Empty) continue;
try {
Console.WriteLine("{0} ({1}) --> {2} ({3}).",
value, value.GetType().Name,
Convert.ChangeType(value, enumType, provider),
enumType.ToString());
}
catch (InvalidCastException) {
Console.WriteLine("Cannot convert a {0} to a {1}",
value.GetType().Name, enumType.ToString());
}
catch (OverflowException) {
Console.WriteLine("Overflow: {0} is out of the range of a {1}",
value, enumType.ToString());
}
}
Console.WriteLine();
}
}
}
// The example displays the following output:
// 103.5 (Double) --> 103.5 (Object).
// 103.5 (Double) --> True (Boolean).
// Cannot convert a Double to a Char
// 103.5 (Double) --> 104 (SByte).
// 103.5 (Double) --> 104 (Byte).
// 103.5 (Double) --> 104 (Int16).
// 103.5 (Double) --> 104 (UInt16).
// 103.5 (Double) --> 104 (Int32).
// 103.5 (Double) --> 104 (UInt32).
// 103.5 (Double) --> 104 (Int64).
// 103.5 (Double) --> 104 (UInt64).
// 103.5 (Double) --> 103.5 (Single).
// 103.5 (Double) --> 103.5 (Double).
// 103.5 (Double) --> 103.5 (Decimal).
// Cannot convert a Double to a DateTime
// Returning a fr-FR numeric format provider.
// 103.5 (Double) --> 103,5 (String).
//
// 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (Object).
// Cannot convert a DateTime to a Boolean
// Cannot convert a DateTime to a Char
// Cannot convert a DateTime to a SByte
// Cannot convert a DateTime to a Byte
// Cannot convert a DateTime to a Int16
// Cannot convert a DateTime to a UInt16
// Cannot convert a DateTime to a Int32
// Cannot convert a DateTime to a UInt32
// Cannot convert a DateTime to a Int64
// Cannot convert a DateTime to a UInt64
// Cannot convert a DateTime to a Single
// Cannot convert a DateTime to a Double
// Cannot convert a DateTime to a Decimal
// 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (DateTime).
// Returning an en-US date/time format provider.
// 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (String).
open System
open System.Globalization
type InterceptProvider() =
interface IFormatProvider with
member _.GetFormat(formatType: Type) =
if formatType = typeof<NumberFormatInfo> then
printfn " Returning a fr-FR numeric format provider."
CultureInfo("fr-FR").NumberFormat
elif formatType = typeof<DateTimeFormatInfo> then
printfn " Returning an en-US date/time format provider."
CultureInfo("en-US").DateTimeFormat
else
printfn $" Requesting a format provider of {formatType.Name}."
null
let values: obj[] = [| 103.5; DateTime(2010, 12, 26, 14, 34, 0)|]
let provider = InterceptProvider()
// Convert value to each of the types represented in TypeCode enum.
for value in values do
// Iterate types in TypeCode enum.
for enumType in Enum.GetValues typeof<TypeCode> :?> TypeCode[] do
match enumType with
| TypeCode.DBNull | TypeCode.Empty -> ()
| _ ->
try
printfn $"{value} ({value.GetType().Name}) --> {Convert.ChangeType(value, enumType, provider)} ({enumType})."
with
| :? InvalidCastException ->
printfn $"Cannot convert a {value.GetType().Name} to a {enumType}"
| :? OverflowException ->
printfn $"Overflow: {value} is out of the range of a {enumType}"
printfn ""
// The example displays the following output:
// 103.5 (Double) --> 103.5 (Object).
// 103.5 (Double) --> True (Boolean).
// Cannot convert a Double to a Char
// 103.5 (Double) --> 104 (SByte).
// 103.5 (Double) --> 104 (Byte).
// 103.5 (Double) --> 104 (Int16).
// 103.5 (Double) --> 104 (UInt16).
// 103.5 (Double) --> 104 (Int32).
// 103.5 (Double) --> 104 (UInt32).
// 103.5 (Double) --> 104 (Int64).
// 103.5 (Double) --> 104 (UInt64).
// 103.5 (Double) --> 103.5 (Single).
// 103.5 (Double) --> 103.5 (Double).
// 103.5 (Double) --> 103.5 (Decimal).
// Cannot convert a Double to a DateTime
// Returning a fr-FR numeric format provider.
// 103.5 (Double) --> 103,5 (String).
//
// 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (Object).
// Cannot convert a DateTime to a Boolean
// Cannot convert a DateTime to a Char
// Cannot convert a DateTime to a SByte
// Cannot convert a DateTime to a Byte
// Cannot convert a DateTime to a Int16
// Cannot convert a DateTime to a UInt16
// Cannot convert a DateTime to a Int32
// Cannot convert a DateTime to a UInt32
// Cannot convert a DateTime to a Int64
// Cannot convert a DateTime to a UInt64
// Cannot convert a DateTime to a Single
// Cannot convert a DateTime to a Double
// Cannot convert a DateTime to a Decimal
// 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (DateTime).
// Returning an en-US date/time format provider.
// 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (String).
Imports System.Globalization
Public Class InterceptProvider : Implements IFormatProvider
Public Function GetFormat(formatType As Type) As Object _
Implements IFormatProvider.GetFormat
If formatType.Equals(GetType(NumberFormatInfo)) Then
Console.WriteLine(" Returning a fr-FR numeric format provider.")
Return New CultureInfo("fr-FR").NumberFormat
ElseIf formatType.Equals(GetType(DateTimeFormatInfo)) Then
Console.WriteLine(" Returning an en-US date/time format provider.")
Return New CultureInfo("en-US").DateTimeFormat
Else
Console.WriteLine(" Requesting a format provider of {0}.", formatType.Name)
Return Nothing
End If
End Function
End Class
Module Example
Public Sub Main()
Dim values() As Object = { 103.5r, #12/26/2010 2:34PM# }
Dim provider As New InterceptProvider()
' Convert value to each of the types represented in TypeCode enum.
For Each value As Object In values
' Iterate types in TypeCode enum.
For Each enumType As TypeCode In DirectCast([Enum].GetValues(GetType(TypeCode)), TypeCode())
If enumType = TypeCode.DbNull Or enumType = TypeCode.Empty Then Continue For
Try
Console.WriteLine("{0} ({1}) --> {2} ({3}).", _
value, value.GetType().Name, _
Convert.ChangeType(value, enumType, provider), _
enumType.ToString())
Catch e As InvalidCastException
Console.WriteLine("Cannot convert a {0} to a {1}", _
value.GetType().Name, enumType.ToString())
Catch e As OverflowException
Console.WriteLine("Overflow: {0} is out of the range of a {1}", _
value, enumType.ToString())
End Try
Next
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' 103.5 (Double) --> 103.5 (Object).
' 103.5 (Double) --> True (Boolean).
' Cannot convert a Double to a Char
' 103.5 (Double) --> 104 (SByte).
' 103.5 (Double) --> 104 (Byte).
' 103.5 (Double) --> 104 (Int16).
' 103.5 (Double) --> 104 (UInt16).
' 103.5 (Double) --> 104 (Int32).
' 103.5 (Double) --> 104 (UInt32).
' 103.5 (Double) --> 104 (Int64).
' 103.5 (Double) --> 104 (UInt64).
' 103.5 (Double) --> 103.5 (Single).
' 103.5 (Double) --> 103.5 (Double).
' 103.5 (Double) --> 103.5 (Decimal).
' Cannot convert a Double to a DateTime
' Returning a fr-FR numeric format provider.
' 103.5 (Double) --> 103,5 (String).
'
' 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (Object).
' Cannot convert a DateTime to a Boolean
' Cannot convert a DateTime to a Char
' Cannot convert a DateTime to a SByte
' Cannot convert a DateTime to a Byte
' Cannot convert a DateTime to a Int16
' Cannot convert a DateTime to a UInt16
' Cannot convert a DateTime to a Int32
' Cannot convert a DateTime to a UInt32
' Cannot convert a DateTime to a Int64
' Cannot convert a DateTime to a UInt64
' Cannot convert a DateTime to a Single
' Cannot convert a DateTime to a Double
' Cannot convert a DateTime to a Decimal
' 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (DateTime).
' Returning an en-US date/time format provider.
' 12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (String).
注解
ChangeType(Object, TypeCode, IFormatProvider) 是一种常规用途转换方法,用于将指定的 value
对象转换为指定的 typeCode
预定义类型。 该 value
参数可以是任何类型的对象。 若要成功转换, value
必须实现 IConvertible 接口,因为该方法只是包装对适当 IConvertible 方法的调用。 该方法还需要 value
支持转换 typeCode
。
该方法 ChangeType(Object, TypeCode, IFormatProvider) 不支持转换为 value
自定义类型。 若要执行此类转换,请调用 ChangeType(Object, Type, IFormatProvider) 该方法。
该 provider
参数是一个 IFormatProvider 实现,它提供转换的格式设置信息。 是否以及如何使用此参数取决于基础 IConvertible 实现。 如果 value
为基数据类型, provider
则仅用于以下转换。 null
IFormatProvider如果参数传递给这些方法,CultureInfo则使用表示当前区域性的对象。
从数字转换为字符串,或从字符串转换为数字。
provider
必须是返回 CultureInfo 对象的对象、 NumberFormatInfo 对象或自定义 IFormatProvider 实现 NumberFormatInfo 。 但是,由于ChangeType(Object, TypeCode, IFormatProvider)该方法使用默认的“G”格式说明符执行转换,因此如果value
或目标类型为无符号整数,参数provider
将不起作用。从 DateTime 值转换为字符串,或从字符串转换为 DateTime 值。
provider
必须是或CultureInfoDateTimeFormatInfo对象。
如果 value
为应用程序定义类型,则其 IConvertible 实现可以使用 provider
参数。