文章一开始,给出下面的实例代码。
public class PhoneNumber:IConvertible { string value; PhoneNumber(string value) { this.value = value; } public TypeCode GetTypeCode() { return TypeCode.Object; } public string ToString(IFormatProvider provider) { return value.ToString(); } public double ToDouble(IFormatProvider provider) { return Convert.ToDouble(value); } public DateTime ToDateTime(IFormatProvider provider) { throw new InvalidCastException("PhoneNumber To DateTime Convertion Is Wrong"); } ...此处省略其他方法的实现 }
代码定义了PhoneNumber类,表示电话号码。
该类实现了IConvertible接口,这样PhoneNumber类就可以通过实现IConvertible接口提供的各种方法来进行类型转换了。
接下来,对IConvertible接口做一个简单的介绍。
IConvertible接口:定义特定的方法,这些方法将实现引用或值类型的值转换为具有等效值的公共语言运行库类型。 (MSDN)
从上面的定义中可以看出,IConvertible接口定义的方法主要是为了将值或者引用类型的值转换成公共语言运行库类型,我们知道公共语言运行库类型包括: Boolean、SByte、Byte、Int16、UInt16、Int32、UInt32、Int64、UInt64、Single、Double、Decimal、DateTime、Char 和 String。其实,到这里,我们便可以猜想到IConvertible接口都定义了哪些方法。具体列表看下面。
这里出现了一个问题。当我们的类实现IConvertible接口时,那是不是所有方法都必须实现呢?要是我们的类到某些类型根本无法转换时,我们又该怎么处理呢?
首先,类实现IConvertible接口,是应该实现该接口定义的所有的方法的。
其次,当类的值无法转换为某种公共语言运行库类型时,应该引发 InvalidCastException异常,如示例代码中ToDateTime方法中的处理所示。
接口中的GetTypeCode方法返回类对象的TypeCode 。TypeCode为一个枚举类型,用于指定对象的类型。其成员如下所示。
那么,.NET类库中有哪些类实现了IConvertible接口呢?
看下图所示。
最后,以System.Boolean为例来看看IConvertible接口的实现。进一步加深印象。
查看System.Boolean源代码。了解到,System.Boolea实现了IConvertible接口的所有方法,下面给出其中3个方法的实现代码。
public TypeCode GetTypeCode() { return TypeCode.Boolean; } char IConvertible.ToChar(IFormatProvider provider) { throw new InvalidCastException(Environment.GetResourceString("InvalidCast_FromTo", new object[] { "Boolean", "Char" })); } decimal IConvertible.ToDecimal(IFormatProvider provider) { return Convert.ToDecimal(this); }
通过源码学习,你会发现许多转换操作最终都会调用Convert 类中的方法来实现。关于这点,MSDN也有说明,通常,公共语言运行库通过 Convert 类公开 IConvertible 接口。
呵呵,好了,撸撸去了。
88