Convert.ChangeType快捷方式吗?

时间:2012-10-08 13:19:01

标签: c# .net

我想知道Object Convert.ChangeType( Object object, Type type)的类型匹配objecttype内发生了什么。它只是简短并返回object

例如:

object objString = "Hello World";

string converted = (string) Convert.ChangeType( objString, typeof ( String ) );

ChangeType的实现是否会实际调用IConvertible接口或只返回objString?

3 个答案:

答案 0 :(得分:6)

根据Microsoft's C# reference sourceConvert.ChangeType(Object, Type)执行以下一般行为:

  • 如果输入为空
    • 如果类型是值类型,则抛出。
    • 否则返回null。
  • 如果输入不是IConvertible
    • 如果类型完全是输入的类型,则返回输入。
    • 否则扔。
  • 如果类型是开箱即用的核心可转换类型之一,请在输入上调用相应的ToWhatever方法。
    • 在每种情况下,如果类型匹配,则实现似乎为return this,否则为return Convert.ToWhatever(this),这是排序的快捷方式。
  • 否则请在输入上调用ToType,将类型传递给。

答案 1 :(得分:2)

是的,它会在对象上调用IConvertible接口。 在字符串的情况下,它将调用objString.ToString(),而objString.ToString()将返回自身(返回此)。

此外,如果对象的类型没有实现IConvertible,并且您转换为相同的类型,那么它将只返回相同的对象。

如果type没有实现IConvertible,你转换为不同的类型,那么将抛出异常。

答案 2 :(得分:0)

This MSDN blog article可能会对您有所帮助。

  

如果该类实现IConvertable接口,则可以使用   System.Convert.ChangeType更改数据类型:

decimal x = (decimal) System.Convert.ChangeType("5", typeof(decimal));
  

将ChangeType视为一个大的switch语句(在VB中选择大小写)...   有很多重载的功能。像这样的东西(免责声明:   这是一个伪代码,而不是确切的.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接口的类必须实现   上面的开关结构中的所有转换加上GetTypeCode:

     

·GetTypeCode

     

·ToBoolean

     

·ToByte

     

·ToChar

     

·ToDateTime

     

·ToDecimal

     

·ToDouble

     

·ToInt16

     

·ToInt32

     

·ToInt64

     

·ToSByte

     

·ToSingle

     

·ToString

     

·ToType

     

·ToUInt16

     

·ToUInt32

     

·ToUInt64

     

System.Convert类有许多可以实现的实现   转,由实现IConvertible接口的类调用。