簡體   English   中英

是否Convert.ChangeType快捷方式?

[英]Does Convert.ChangeType Shortcut?

我想知道當object typetype相匹配時Object Convert.ChangeType( Object object, Type type)內部會發生什么。 它只是捷徑並返回object嗎?

例如:

object objString = "Hello World";

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

ChangeType的實現會實際調用IConvertible接口還是只返回objString?

根據Microsoft的C#參考源Convert.ChangeType(Object, Type)執行以下一般行為:

  • 如果輸入為空
    • 如果類型是值類型,則拋出。
    • 否則返回null。
  • 如果輸入不是IConvertible
    • 如果類型恰好是輸入的類型,則返回輸入。
    • 否則拋出。
  • 如果該類型是現成的核心可轉換類型之一,請在輸入上調用相應的ToWhatever方法。
    • 在每種情況下,如果類型匹配,則實現似乎return this ,否則return Convert.ToWhatever(this) ,這是一種排序的快捷方式。
  • 否則,在輸入上調用ToType ,以傳遞類型。

是的,它將在對象上調用IConvertible接口。 如果是字符串,它將調用objString.ToString(),而objString.ToString()隨后將返回自身(返回此值)。

另外,如果對象類型未實現IConvertible,而您轉換為相同類型,則它將僅返回相同對象。

如果type不實現IConvertible,而您將其轉換為其他類型,則將引發異常。

此MSDN博客文章可能會為您提供幫助。

如果該類實現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

·布爾值

·ToByte

·托查

·ToDateTime

·十進制

·ToDouble

·ToInt16

·ToInt32

·ToInt64

·ToSByte

·ToSingle

·ToString

· 輸入

·ToUInt16

·ToUInt32

·ToUInt64

System.Convert類具有許多實現,而這些實現又可以由實現IConvertible接口的類調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM