2008-11-23 107 views
21

我的方案應該是簡單的......我想轉換FROM類型是總是「串」。我想轉換爲...可能是很多東西 - 整型,DateTime是否......字符串等如何在運行時轉換類型?

這會很容易:

string valueToConvertFrom = "123"; 

int blah = Convert.ToInt32(valueToConvertFrom); 

不過......我不知道(直到運行時),我需要轉換的值是'Int'(或其他)。我試過這個:

string valueToConvertFrom = "123"; 

Type convertToType = typeof(int); 

object blah = Convert.ChangeType(valueToConvertFrom, convertToType); 

但是,這給了我以下錯誤:「對象必須實現IConvertible。」

我不想要做一個switch語句,並呼籲「Convert.ToBlah」的基礎上的類型名稱...有什麼建議?

+0

請重新打開並添加您找到了答案,萬一別人有未來相同或類似的問題 – 2008-11-23 19:50:29

+1

我之所以關閉它,是因爲我的代碼中有一個錯誤...我最初從錯誤的領域拉,而且該領域沒有實現IConvertible。 +1兩個答案...「字符串類實現IConvertible,這個代碼簡單地應該工作」這是真的。但是Asher的解決方案非常棒,因爲我學到了一些新東西(這是一個非常乾淨的解決方案)。再次感謝! – 2008-11-24 12:43:51

回答

30

乾淨的做法是使用TypeConverter。 通過調用TypeDescriptor.GetConverter,然後使用類型轉換器的實例進行轉換,可以獲得類型轉換器的實例。 所以是這樣的:

string valueToConvertFrom = "123"; 

Type convertToType = typeof(int); 

TypeConverter tc = TypeDescriptor.GetConverter(convertToType);    

object blah =tc.ConvertFromString(valueToConvertFrom); 
5

String類實現IConvertible,這個簡單的代碼應該工作。你瞄準哪個版本的.NET?

object o = Convert.ChangeType(str, convertToType); 

另外,你提到的大多數類型實現了Parse方法,所以你最好的鏡頭可能是這樣的。

Type convertToType = ...; 
MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static); 
object blah; 
if(mi != null) 
{ 
    blah = mi.Invoke(null, new object[]{valueToConvertFrom}); 
} 
else 
{ 
    // the type doesn't implement the Parse method, handle it another way :/ 
} 
+2

這看起來就像一個黑客... – Asher 2008-11-23 20:16:04

5

提摩太的問題,因爲一般適用於.NET類型轉換的問題,是一個非常大的問題。儘管在具有已知類型的特定場景中轉換策略有些簡單,但不幸的是,在.NET的任何實現中,沒有一種通用策略可以在運行時從一個任意類型到另一個類型實現類型轉換,這種策略也不是雷蒙德即將推出的。然而,微軟提供了一些很好的指導方針進行類型轉換的總體思路,包括:

我不得不應對相同的一般問題,我係統,並且作爲一種解決方案,我已將所有標準策略整合爲一種方法。這個問題的範圍很廣泛,相關的轉換策略也各不相同,所以這種綜合方法只能在一篇完整的技術文章中介紹。不過,我在這裏提供了我的方法文檔的副本,希望這將有助於您牢牢掌握需要解決的整體需求,以便開發類似的通用解決方案。這裏的鏈接到我的文檔:

我希望這可以幫助你,

馬克

相關問題