2011-05-06 64 views
13

在下面的代碼我得到colType這是類型的代碼數。但是,我將如何將該數字轉換爲實際類型?謝謝!!如何將TypeCode轉換爲實際類型?

for (int j = 0; j < dvColumns.Count; j++) 
{ 
    // Get the name of the column. 
    drvCols = dvColumns[j]; 
    colName = drvCols.Row.ItemArray[3].ToString(); 

    // Get columns data type code and save it off. 
    colType = Convert.ToInt32(drvCols.Row.ItemArray[11]); 
} 
+4

給所述輸入的一個例子。 – Tejs 2011-05-06 18:50:53

+1

您必須使用colType值的開關大小寫。 – 2011-05-06 19:19:55

+0

問題是我不知道什麼類型的數字代表什麼類型。例如,返回的其中一個數字是72.我怎麼知道72型應該代表什麼? – user259286 2011-05-06 19:22:53

回答

3

我不認爲有什麼辦法可以在.NET Framework本身做到這一點,因爲我已經看到了使用一個大的switch語句來處理轉換(例如:here)的所有例子。

但是,如果您嘗試將類型作爲將對象轉換爲該類型的中間步驟,則始終可以使用接受TypeCode作爲參數的Convert.ChangeType

double d = -1.234; 
int i = (int)Convert.ChangeType(d, TypeCode.Int32); 

不幸的是,沒有看到你正在嘗試做的我真的不能說,如果ChangeType將是有益與否。

編輯:

要將int轉換爲OleDbType,你可以將它轉換:

int i = 72; //72 is the value for OleDbType.Guid 
if(Enum.IsDefined(typeof(System.Data.OleDb.OleDbType), i)) 
{ 
    System.Data.OleDb.OleDbType dbType = (System.Data.OleDb.OleDbType)i; 
    Console.WriteLine(dbType); 
} 
else 
    Console.WriteLine("{0} is not defined for System.Data.OleDb.OleDbType", i); 
+0

如果有'Convert.TryChangeType (d,TypeCode.Int32,出牛逼V)'只是因爲有些情況下,你可能會使用'開關(類型碼)實例'辦理值類型這將是很好。否則,你最終執行上'D'各種檢查,以確保'Convert'不拋出異常。 – IAbstract 2016-04-28 18:49:57

11

使用switch語句:

public static Type ToType(this TypeCode code) 
    { 
     switch (code) 
     { 
      case TypeCode.Boolean: 
       return typeof(bool); 

      case TypeCode.Byte: 
       return typeof(byte); 

      case TypeCode.Char: 
       return typeof(char); 

      case TypeCode.DateTime: 
       return typeof(DateTime); 

      case TypeCode.DBNull: 
       return typeof(DBNull); 

      case TypeCode.Decimal: 
       return typeof(decimal); 

      case TypeCode.Double: 
       return typeof(double); 

      case TypeCode.Empty: 
       return null; 

      case TypeCode.Int16: 
       return typeof(short); 

      case TypeCode.Int32: 
       return typeof(int); 

      case TypeCode.Int64: 
       return typeof(long); 

      case TypeCode.Object: 
       return typeof(object); 

      case TypeCode.SByte: 
       return typeof(sbyte); 

      case TypeCode.Single: 
       return typeof(Single); 

      case TypeCode.String: 
       return typeof(string); 

      case TypeCode.UInt16: 
       return typeof(UInt16); 

      case TypeCode.UInt32: 
       return typeof(UInt32); 

      case TypeCode.UInt64: 
       return typeof(UInt64); 
     } 

     return null; 
    } 
18

這是更簡單:

Type type = Type.GetType("System." + colType); 

如果您希望將值轉換爲這種類型的,你可以直接使用

Convert.ChangeType(value, colType); 
+0

看到一個襯墊確切回答,我寫了下面使用schoetbi的提示和'Enum.GetName(typeof運算(類型碼)'在 http://stackoverflow.com/a/30780954/1300390 – 2016-05-16 20:45:34

3

確切的答案,在OP的問題(使用schoetbi的提示)類型代碼爲:

public static Type GetType(TypeCode code) 
    {   
     return Type.GetType("System." + Enum.GetName(typeof(TypeCode), code)); 
    } 
+0

我測試過它和問題它適用於我,沒有任何問題 – 2016-01-08 17:29:04

2

以下是我喜歡的方式。我更喜歡使用一個靜態表與一個大開關或反射。

/// <summary> 
/// Table that maps TypeCode to it's corresponding Type. 
/// </summary> 
static IReadOnlyDictionary<TypeCode, Type> TypeCodeToTypeMap = new Dictionary<TypeCode, Type> 
{ 
    { TypeCode.Boolean, typeof(bool) }, 
    { TypeCode.Byte, typeof(byte) }, 
    { TypeCode.Char, typeof(char) }, 
    { TypeCode.DateTime, typeof(DateTime) }, 
    { TypeCode.DBNull, typeof(DBNull) }, 
    { TypeCode.Decimal, typeof(decimal) }, 
    { TypeCode.Double, typeof(double) }, 
    { TypeCode.Empty, null }, 
    { TypeCode.Int16, typeof(short) }, 
    { TypeCode.Int32, typeof(int) }, 
    { TypeCode.Int64, typeof(long) }, 
    { TypeCode.Object, typeof(object) }, 
    { TypeCode.SByte, typeof(sbyte) }, 
    { TypeCode.Single, typeof(Single) }, 
    { TypeCode.String, typeof(string) }, 
    { TypeCode.UInt16, typeof(UInt16) }, 
    { TypeCode.UInt32, typeof(UInt32) }, 
    { TypeCode.UInt64, typeof(UInt64) } 
}; 

/// <summary> 
/// Convert a TypeCode ordinal into it's corresponding Type instance. 
/// </summary> 
public static Type ToType(this TypeCode code) 
{ 
    Type type = null; 

    TypeCodeToTypeMap.TryGetValue(code, out type); 

    return type; 
} 
+0

'switch'是一個實現細節,很容易隱藏在一個擴展方法中,'switch'由於彙編而不是通過映射進行運行時解碼,所以比字典更快。 – IAbstract 2016-04-28 18:54:38

+1

很久以前,當我深入C++時,Scott Meyers告訴我switch語句通常運行O(n),而我們往往可以做得更好,所以我傾向於使用maps/dictionaries /哈希表不僅可讀性,但通常O(1)的表現。我想資料這個,看看什麼是真正的C#重要的。 – BrandonLWhite 2016-04-28 19:34:13

+2

那麼事實證明他們是comparab樂。在Release版本中,交換機在字典上有一個非常輕微的優勢。在Debug版本中(如果有人關心),Dictionary實際上比較了很多。很有意思。我的結論是,編譯器優化開關的行爲更像哈希表。所以在性能方面,這是一種洗滌。做你認爲更可讀的東西。 https://gist.github.com/BrandonLWhite/d823dcbddc256be6fd879b7be7d3960f – BrandonLWhite 2016-04-28 21:15:07

相關問題