2010-05-21 57 views
1

.Net框架包含一個名爲Convert的優秀類,它允許在簡單類型,DateTime類型和String類型之間進行轉換。此外,該類還支持實現IConvertible接口類型的轉換。將字符串轉換爲簡單類型

該類已經在.Net框架的第一個版本中實現。第一個.Net框架中有幾件事情做得不對。例如,對於簡單類型的Parse方法,如果字符串不能被解析,並且沒有辦法檢查異常是否會被提前拋出,則會拋出異常。

.Net Framework的未來版本通過引入解決此問題的TryParse方法消除了此缺陷。

Convert類的歷史可以追溯到舊的Parse方法的時間,因此該類中的ChangeType方法已實現舊樣式 - 如果無法執行轉換,則會拋出異常。

看看下面的代碼:

public static T ConvertString<T>(string s, T @default) 
{ 
    try 
    { 
     return (T)Convert.ChangeType(s, typeof(T), CultureInfo.InvariantCulture); 
    } 
    catch (Exception) 
    { 
     return @default; 
    }    
} 

此代碼基本上我想要做什麼。不過,我很想避免這裏的醜陋嘗試。我相信,與TryParse類似,有一種現代的方法來重寫這些代碼,而不是全部。你能建議一個嗎?

+0

如果使用try/catch,如果它只會很少發生,例如,如果某些格式錯誤,那麼不會感到羞恥。這就是如果你在大部分時間遇到性能問題都會觸發該問題。 – Chris 2010-05-21 03:57:46

+0

是的,這將是我想避免它的另一個原因。有時候很難預測代碼的使用/調用方式和位置,因此您希望「正確」執行代碼。 – 2010-05-21 03:59:28

回答

1

有沒有這樣的方法,永遠不會有。

Convert.Change調用IConvertible實現通過它執行轉換的對象。

由於IConvertible接口沒有定義TryConvertTo方法,因此不可能編寫TryConvertTo方法。 (添加新的方法來IConvertible將是一個重大變化)

這將有可能爲微軟創造ISafeConvertible接口與其他方法,但我不認爲他們會的。

+0

我的意思是方法不像「類型上的方法」,而是方法來實現某些東西。不過謝謝你的回答。爲了擴展,我期待着一個更新的不同版本的Convert類,它可能不會被綁定到IConvertible上。或者在某種程度上。 – 2010-05-21 04:04:24

+0

你所能做的就是編寫你自己的'switch'語句。 – SLaks 2010-05-21 04:06:00