System.IConvertible 接口

方法描述

定义特定的方法,这些方法将实现引用或值类型的值转换为具有等效值的公共语言运行时类型。

语法定义(C# System.IConvertible 接口 的用法)

[ComVisibleAttribute(true)]
[CLSCompliantAttribute(false)]
public interface IConvertible

构造函数

构造函数名称 构造函数描述

成员/方法

方法名称 方法描述
GetTypeCode 返回此实例的 TypeCode。
ToBoolean 使用指定的区域性特定格式设置信息将此实例的值转换为等效的 Boolean 值。
ToByte 使用指定的区域性特定格式设置信息将该实例的值转换为等效的 8 位无符号整数。
ToChar 使用指定的区域性特定格式设置信息将此实例的值转换为等效的 Unicode 字符。
ToDateTime 使用指定的区域性特定格式设置信息将此实例的值转换为等效的 DateTime。
ToDecimal 使用指定的区域性特定格式设置信息将此实例的值转换为等效的 Decimal 数字。
ToDouble 使用指定的区域性特定格式设置信息将此实例的值转换为等效的双精度浮点数字。
ToInt16 使用指定的区域性特定格式设置信息将此实例的值转换为等效的 16 位有符号整数。
ToInt32 使用指定的区域性特定格式设置信息将此实例的值转换为等效的 32 位有符号整数。
ToInt64 使用指定的区域性特定格式设置信息将此实例的值转换为等效的 64 位有符号整数。
ToSByte 使用指定的区域性特定格式设置信息将此实例的值转换为等效的 8 位有符号整数。
ToSingle 使用指定的区域性特定格式设置信息将此实例的值转换为等效的单精度浮点数字。
ToString 使用指定的区域性特定格式设置信息将此实例的值转换为等效的 String。
ToType 使用指定的区域性特定格式设置信息将此实例的值转换为具有等效值的指定 Type 的 Object。
ToUInt16 使用指定的区域性特定格式设置信息将该实例的值转换为等效的 16 位无符号整数。
ToUInt32 使用指定的区域性特定格式设置信息将该实例的值转换为等效的 32 位无符号整数。
ToUInt64 使用指定的区域性特定格式设置信息将该实例的值转换为等效的 64 位无符号整数。

提示和注释

此接口提供特定的方法,用以将实现类型的实例值转换为具有等效值的公共语言运行时类型。 公共语言运行时类型包括 Boolean、SByte、Byte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、Decimal、DateTime、Char 和 String。

如果转换为公共语言运行时类型不具有任何意义,特定的接口方法实现则会引发 InvalidCastException。 例如,如果该接口在 Boolean 类型上实现,由于没有与 Boolean 类型等效且具有意义的 DateTime,ToDateTime 方法的实现会引发异常。

通常,公共语言运行时通过 Convert 类公开 IConvertible 接口。 在接口的显式实现中,公共语言运行时还在内部使用 IConvertible 接口来简化特定的代码,这些代码用于支持 Convert 类和基本公共语言运行时类型中的转换。

除了 IConvertible 接口之外,.NET Framework 还提供称作类型转换器的类来将用户定义的数据类型转换为其他数据类型。 有关更多信息,请参见主题通用类型转换。

对实现者的说明

如果实现 IConvertible 接口,则在 Object 参数是您的实现类型的实例并且 Type 参数是公共语言运行时类型的情况下,Convert.ChangeType 方法会自动调用您的实现。

大多数转换方法有一个类型为 IFormatProvider 的参数,代表当前区域性 (CultureInfo.CurrentCulture) 或特定区域性。 大多数情况下,基类型的 IConvertible 实现将忽略此参数。 但是,可以选择是否在您的代码中使用它。

System.IConvertible 接口例子

下面的代码示例演示 Complex 数字类的 IConvertible 的一个实现,使该类首先可强制转换为 Double,然后调用该 Double 的静态 Convert 成员。

using System;

namespace ConsoleApplication2
{

	/// Class that implements IConvertible
	class Complex : IConvertible
	{
		double	x;
		double	y;

		public Complex(double x, double y)
		{
			this.x = x;
			this.y = y;
		}

		public TypeCode GetTypeCode()
		{
			return TypeCode.Object;
		}

		bool IConvertible.ToBoolean(IFormatProvider provider)
		{
			if(	(x != 0.0) || (y != 0.0) )
				return true;
			else
				return false;
		}

		double GetDoubleValue()
		{
			return Math.Sqrt(x*x + y*y);
		}

		byte IConvertible.ToByte(IFormatProvider provider)
		{
			return Convert.ToByte(GetDoubleValue());
		}

		char IConvertible.ToChar(IFormatProvider provider)
		{
			return Convert.ToChar(GetDoubleValue());
		}

		DateTime IConvertible.ToDateTime(IFormatProvider provider)
		{
			return Convert.ToDateTime(GetDoubleValue());
		}

		decimal IConvertible.ToDecimal(IFormatProvider provider)
		{
			return Convert.ToDecimal(GetDoubleValue());
		}

		double IConvertible.ToDouble(IFormatProvider provider)
		{
			return GetDoubleValue();
		}

		short IConvertible.ToInt16(IFormatProvider provider)
		{
			return Convert.ToInt16(GetDoubleValue());
		}

		int IConvertible.ToInt32(IFormatProvider provider)
		{
			return Convert.ToInt32(GetDoubleValue());
		}

		long IConvertible.ToInt64(IFormatProvider provider)
		{
			return Convert.ToInt64(GetDoubleValue());
		}

		sbyte IConvertible.ToSByte(IFormatProvider provider)
		{
			return Convert.ToSByte(GetDoubleValue());
		}

		float IConvertible.ToSingle(IFormatProvider provider)
		{
			return Convert.ToSingle(GetDoubleValue());
		}

		string IConvertible.ToString(IFormatProvider provider)
		{
			return String.Format("({0}, {1})", x, y);
		}

		object IConvertible.ToType(Type conversionType, IFormatProvider provider)
		{
			return Convert.ChangeType(GetDoubleValue(),conversionType);
		}

		ushort IConvertible.ToUInt16(IFormatProvider provider)
		{
			return Convert.ToUInt16(GetDoubleValue());
		}

		uint IConvertible.ToUInt32(IFormatProvider provider)
		{
			return Convert.ToUInt32(GetDoubleValue());
		}

		ulong IConvertible.ToUInt64(IFormatProvider provider)
		{
			return Convert.ToUInt64(GetDoubleValue());
		}

	}

	/// 
	/// Summary description for Class1.
	/// 
	class Class1
	{
		static void Main(string[] args)
		{

			Complex		testComplex = new Complex(4,7);

			WriteObjectInfo(testComplex);
			WriteObjectInfo(Convert.ToBoolean(testComplex));
			WriteObjectInfo(Convert.ToDecimal(testComplex));
			WriteObjectInfo(Convert.ToString(testComplex));

		}

		static void WriteObjectInfo(object testObject)
		{
			TypeCode	typeCode = Type.GetTypeCode( testObject.GetType() );

			switch( typeCode )
			{
				case TypeCode.Boolean:
					Console.WriteLine("Boolean: {0}", testObject);
					break;

				case TypeCode.Double:
					Console.WriteLine("Double: {0}", testObject);
					break;
								
				default:
					Console.WriteLine("{0}: {1}", typeCode.ToString(), testObject);
					break;
			}
		}
	}
}

继承层次结构

命名空间

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 系统要求。