2014-09-04 20 views
2

在我的方法中,我想處理可爲空的整數值。通用類型可空和ToString

public String FormatValue(Int32? item) 
{ 
if (item.HasValue==false) return ""; 
return item.Value.ToString("### ### ###"); 
} 

我們這樣做沒有想寫Int32?Int64?並從該方法的其他版本,所以我們要重構它來處理泛型類型參數:

public String FormatValue<T>(T item) 
{ 
if (item.HasValue==false) return ""; // ERROR: no .HasValue property 
return item.Value.ToString("### ### ###"); // ERROR: usually has no ToString() with string argument 
} 

我應該如何處理這種情況?我試圖使用"where T"條款,但沒有任何成功。

回答

2

由於你只希望你的方法可以爲空類型,但將T?作爲參數而不是T似乎沒有問題。然後,您可以約束T:它必須實現IFormattable,基本整數類型實現該功能。

public string FormatValue<T>(T? item) where T : struct, IFormattable 
{ 
    if (item == null) return ""; 
    return item.Value.ToString("### ### ###", null); 
} 
+0

這就是所有我想要的東西:) THX! – 2014-09-04 07:10:24

2

嘗試定義的方法的參數作爲Nullable<T>

public String FormatValue<T>(Nullable<T> item) where T : struct 
{ 
    return item.HasValue ? item.Value.ToString("### ### ###") : String.Empty; 
} 
+2

'T'必須是爲了通過通用'nullable'一個結構。 – 2014-09-04 06:58:23

+0

@pwas,謝謝。我錯過了。 – Dmitry 2014-09-04 06:59:47

5

首先:

public String FormatValue<T>(Nullable<T> item) 
    where T : struct, IFormattable 
{ 
    if (item.HasValue==false) return ""; 
    return item.Value.ToString("### ### ###", null /* you format provider */); 
} 

你傳入通用T作爲參數,但你需要Nullable

其次:在Nullable ToString()已經在做你所需要的 - 你不必做手工(這是在情況下,當你不必格式):

int? a = null; 
Console.WriteLine(a.ToString()); // outputs "", no any exception 
+0

不,我的anwser在哪裏也發佈了與你非常相似的時間。發佈後我總是測試解決方案(當我不確定時),然後更正錯誤。這是問題的唯一解決方案,所以不要生氣,它是一樣的(並且有類似的錯誤),不要冒犯我。 – 2014-09-04 07:05:39

+2

@ hvd他甚至比你快一點,他的空檢查與你的不同。我不認爲這是一個副本。 – Marwie 2014-09-04 07:06:18

+0

如果你已經包含了一個正確的版本,我確實會假設你獨立地提出了它,但是在兩個獨立的答案中有相同的錯誤通常是不太可能的。但如果其他人似乎認爲它可能在這裏,那麼我想我會給你帶來懷疑的好處。 (順便說一句,編輯歷史不會顯示發佈後的前五分鐘內所做的更改,並且在前五分鐘內已更改此答案。在這種情況下,將它們顯示爲有用)。 – hvd 2014-09-04 07:07:24

1

使用IFormattable可能是最好的想法,但你也可以使用string.Format

public string FormatValue<T>(T? item) where T : struct 
{ 
    return string.Format("{0:### ### ###}", item); 
}