泛型轉字串可能發生的各種情形
在實作手頭上的專案時,有個需要將各種型態的變數轉為字串做處理的功能,原先以為使用泛型就可以解決問題,沒想到各種型態轉字串時都必須有各種不同的處理方式。以下就將一一地介紹各種型態轉字串時,需要做怎麼樣的處理。
1.程式雛形
這邊利用擴充方法,首先判斷傳入的字串是否等同於default(T),若相同則return原字串。
此動作是因為某些型態的default值(如string的default值為null),會造成字串的exception,在這邊先將此情形作排除。
將傳入的變數轉為string後,把-取代成空白。應用方式如下。
在後面加上.replaceDash(),即可將傳入變數的-取代成空白。成果如下圖。
2.後續問題
原本以為這樣就沒問題了,但後續專案在遇到各種不同的形態轉字串上卻發生各種不同的錯誤,以下就根據各種錯誤的情形來進行修正。
(1) Nullable類型轉字串時會產生錯誤
在Nullable會產生Exception的情形,所以我們將程式碼進行了一些改良,主要是針對Nullable來做處理。如下圖。
最後可以看到不管是Nullable或者是非Nullable的值都不會報錯了。
(2)Guid類型會產生錯誤
錯誤上明確地寫著無法從String轉為Guid,所以我們也必須針對Guid(別忘了Nullable Guid)來做處理,如下圖。
最後可以看到不管是Nullable Guid或者是非Nullable Guid的值都不會報錯了。
(3)DateTime類型會發生錯誤
從上圖可以看到,string"2019/11/12 上午 12:00:00" 無法轉成DateTime,而且這邊有個魔鬼般的小細節,就是要注意十二小時跟二十四小時制的換算。所以在修正轉換錯誤時也必須將正確的時間同時修正上去。修正後的結果如下圖。
最後可以看到不管是Nullable DateTime或者是非Nullable DateTime的值都不會報錯,而且時制的轉換也是正確的了。
(4)加上Try&Catch使程式更穩定
最後在專案測試沒問題後,決定將程式加上Try&Catch讓程式更加穩定。
此處catch拋回的是default而不是原字串,主要是因為資安掃描的緣故,若正常來說拋回原字串是比較恰當的做法。
3.後記
原先以為是個簡單的功能,沒想到後面有這麼多衍生的問題,不過也讓我從中學習到了很多。