C# Generic .Net

泛型轉字串可能發生的各種情形

郭駿佑 2019/12/05 14:14:54
118

在實作手頭上的專案時,有個需要將各種型態的變數轉為字串做處理的功能,原先以為使用泛型就可以解決問題,沒想到各種型態轉字串時都必須有各種不同的處理方式。以下就將一一地介紹各種型態轉字串時,需要做怎麼樣的處理。

1.程式雛形

1

這邊利用擴充方法,首先判斷傳入的字串是否等同於default(T),若相同則return原字串。

此動作是因為某些型態的default值(如string的default值為null),會造成字串的exception,在這邊先將此情形作排除。

將傳入的變數轉為string後,把-取代成空白。應用方式如下。

2.JPG

在後面加上.replaceDash(),即可將傳入變數的-取代成空白。成果如下圖。

3.JPG

2.後續問題

原本以為這樣就沒問題了,但後續專案在遇到各種不同的形態轉字串上卻發生各種不同的錯誤,以下就根據各種錯誤的情形來進行修正。

(1) Nullable類型轉字串時會產生錯誤

4.JPG

在Nullable會產生Exception的情形,所以我們將程式碼進行了一些改良,主要是針對Nullable來做處理。如下圖。

5.JPG

最後可以看到不管是Nullable或者是非Nullable的值都不會報錯了。

6.JPG

(2)Guid類型會產生錯誤

7.JPG

錯誤上明確地寫著無法從String轉為Guid,所以我們也必須針對Guid(別忘了Nullable Guid)來做處理,如下圖。

8.JPG

最後可以看到不管是Nullable Guid或者是非Nullable Guid的值都不會報錯了。

9

(3)DateTime類型會發生錯誤

10

從上圖可以看到,string"2019/11/12 上午 12:00:00" 無法轉成DateTime,而且這邊有個魔鬼般的小細節,就是要注意十二小時跟二十四小時制的換算所以在修正轉換錯誤時也必須將正確的時間同時修正上去。修正後的結果如下圖。

11.jpg

最後可以看到不管是Nullable DateTime或者是非Nullable DateTime的值都不會報錯,而且時制的轉換也是正確的了。

12.JPG

(4)加上Try&Catch使程式更穩定

最後在專案測試沒問題後,決定將程式加上Try&Catch讓程式更加穩定。

13.jpg

此處catch拋回的是default而不是原字串,主要是因為資安掃描的緣故,若正常來說拋回原字串是比較恰當的做法。

3.後記

原先以為是個簡單的功能,沒想到後面有這麼多衍生的問題,不過也讓我從中學習到了很多。

郭駿佑