System.Convert.ChangeType 方法 (Object, TypeCode, IFormatProvider)

方法描述

返回一个指定类型的对象,该对象的值等于指定的对象。 参数提供区域性特定的格式设置信息。

语法定义(C# System.Convert.ChangeType 方法 (Object, TypeCode, IFormatProvider) 的用法)

public static Object ChangeType(
	Object value,
	TypeCode typeCode,
	IFormatProvider provider
)

参数/返回值

参数值/返回值 参数类型/返回类型 参数描述/返回描述
value System-Object 用于实现 IConvertible 接口的对象。
typeCode System-TypeCode 要返回的对象的类型。
provider System-IFormatProvider 一个提供区域性特定的格式设置信息的对象。
返回值 System.Object 一个基础类型为 typeCode 的对象,其值等效于 value。 - 或 - 如果 value 是 null,且 typeCode 是 Empty、String 或 Object,则为 null 引用(Visual Basic 中为 Nothing)。

提示和注释

ChangeType(Object, TypeCode, IFormatProvider) 是将 value 指定的对象转换为 typeCode 指定的预定义类型的通用转换方法。 value 参数可以是任何类型的对象。 要使转换成功,value 必须实现 IConvertible 接口,因为此方法只是包装对相应 IConvertible 方法的调用。 此方法还要求将 value 转换为 typeCode 受支持。

ChangeType(Object, TypeCode, IFormatProvider) 方法不支持将 value 转换为自定义类型。 要执行这样的转换,请调用 ChangeType(Object, Type, IFormatProvider) 方法。

provider 参数是为转换提供格式设置信息的 IFormatProvider 实现。 如果 value 是基数据类型,则 provider 只用于下列转换:

从数字到字符串的转换,或从字符串到数字的转换。 provider 必须是 CultureInfo 对象、NumberFormatInfo 对象或返回 NumberFormatInfo 对象的自定义 IFormatProvider 实现。 但是,由于 ChangeType(Object, TypeCode, IFormatProvider) 方法使用默认的"G"格式说明符执行转换,因此如果 value 或目标类型是无符号整数,则 provider 参数没有任何作用。

从 DateTime 值到字符串的转换,或从字符串到 DateTime 值的转换。 provider 必须是 CultureInfo 或 DateTimeFormatInfo 对象。

如果 value 是应用程序定义的类型,则其 IConvertible 实现可以使用 provider 参数。

System.Convert.ChangeType 方法 (Object, TypeCode, IFormatProvider)例子

此示例说明了该方法何时使用 IFormatProvider 参数,还说明了如何使用 provider 参数执行区分区域性的格式设置。

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).

异常

异常 异常描述
InvalidCastException
  • 不支持此转换。
  • value 为 null,而且 typeCode 指定一个值类型。
  • value 不实现 IConvertible 接口。
FormatException value 的格式不是 provider 可以识别的 typeCode 类型的格式。
OverflowException value 表示超出 typeCode 类型范围的数字。
ArgumentException typeCode 无效。

命名空间

namespace: System

程序集: mscorlib(在 mscorlib.dll 中)

版本信息

.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1

适用平台

Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。