我想知道当object的类型与type匹配时,Object Convert.ChangeType( Object object, Type type)内部会发生什么。它是否只是一条捷径并返回object
例如:
object objString = "Hello World";
string converted = (string) Convert.ChangeType( objString, typeof ( String ) );ChangeType的实现实际上是调用IConvertible接口还是只返回objString?
发布于 2012-10-08 22:55:29
根据Microsoft's C# reference source的说法,Convert.ChangeType(Object, Type)执行以下一般行为:
如果输入为null.,则返回
IConvertible
ToWhatever方法。return this,否则看起来是return Convert.ToWhatever(this),这是的快捷方式
ToType,将类型传递给。发布于 2012-10-08 21:24:56
是的,它会在对象上调用IConvertible接口。对于字符串,它将调用objString.ToString(),而后者将返回自身(返回this)。
此外,如果对象的类型没有实现IConvertible,而您将其转换为相同的类型,那么它将只返回相同的对象。
如果类型没有实现IConvertible,并且您转换为不同的类型,则将抛出异常。
发布于 2012-10-08 21:31:02
This MSDN blog article可能会对您有所帮助。
如果该类实现了IConvertable接口,则可以使用System.Convert.ChangeType更改数据类型:
decimal x = (decimal) System.Convert.ChangeType("5", typeof(decimal));将ChangeType看作一个大的switch语句(VB中的select case )…有很多重载的函数。类似这样的东西(免责声明:这是一个伪代码,而不是确切的.NET实现):
public static Object ChangeType(Object value, TypeCode typeCode , IFormatProvider provider)
{
IConvertible v = value as IConvertible;
switch (typeCode) {
case TypeCode.Boolean:
return v.ToBoolean(provider);
case TypeCode.Char:
return v.ToChar(provider);
case TypeCode.SByte:
return v.ToSByte(provider);
case TypeCode.Byte:
return v.ToByte(provider);
case TypeCode.Int16:
return v.ToInt16(provider);
case TypeCode.UInt16:
return v.ToUInt16(provider);
. . .
}声明实现IConvertible接口的类必须实现上述switch结构中的所有转换,外加GetTypeCode:
·GetTypeCode
·ToBoolean
·ToByte
·ToChar
·ToDateTime
·ToDecimal
·ToDouble
·ToInt16
·ToInt32
·ToInt64
·ToSByte
·ToSingle
·ToString
·ToType
·ToUInt16
·ToUInt32
·ToUInt64
System.Convert类有许多实现,实现IConvertible接口的类可以依次调用这些实现。
https://stackoverflow.com/questions/12782606
复制相似问题