2010-06-16 53 views
2

考慮以下方法:(真正的方法有幾個參數,但重要的有以下...)如何判斷格式化程序中的替換次數?

public string DoSomething(string formatter, params string[] values) 
{ 
    // Do something eventually involving a call to String.Format(formatter, values); 
} 

有沒有辦法判斷自己的價值觀陣列中有足夠的對象覆蓋格式化程序,這樣我就可以拋出一個異常(如果沒有執行string.Format;由於某些lambda轉換,這不是一個選項)?

+1

那麼你可以解析格式化字符串,但你能詳細說明爲什麼你不能只調用string.Format? – Skurmedel 2010-06-16 20:55:28

+0

因爲他不想做他的lambda工作,直到他知道他有足夠的參數... – 2010-06-16 20:58:35

+0

看看源代碼。如果他們能夠弄清楚有多少令牌,那麼你也應該這樣做。 – 2010-06-16 21:22:08

回答

4

我還不清楚你爲什麼認爲你不能用string.Format來測試它。如果在格式傳遞應該有價值觀的項目佔位符,那麼你應該能夠做到這一點:

static void TestFormat(string formatter, params string[] values) 
{ 
    try 
    { 
     string.Format(formatter, values); 
    } 
    catch (FormatException e) 
    { 
     throw new Exception("the format is bad!!", e); 
    } 
} 

用法示例:

 TestFormat("{0}{1}{2}", "a", "b", "c"); // works ok 
     TestFormat("{0}{1}{2}", "a", "b"); // throws exception 
     TestFormat("{0}{1}{2}}0{", "a", "b", "c"); // throws exception 

試圖用一個正則表達式來做到這一點將是艱難的,因爲什麼事情是這樣的:

"{0}, {1}, {abc}, {1a4} {5} }{" 

{abc}{1a4}不適用於string.Format,你也必須爲每個有效數字({0}, {1}, {5})確定您至少有很多參數。另外,}{也會導致string.Format失敗。

我剛剛在最近的一個項目中使用了上述的前一種方法,並且效果很好。

+0

這是如何回答這個問題的?我可以想到爲什麼你需要知道需要填充多少令牌的幾個原因。您可能希望根據可用的令牌數填充它們。想想asp.net mvc webform視圖引擎使用字符串來查找視圖的方式。這是一個有效的用途,不是嗎? – 2010-06-16 21:33:56

+0

我想我可以使用string.Format來初始化測試值,即使輸入類型不是我最終用來格式化字符串的東西。在兩種情況下,項目的數量都會匹配。對於寫得不好的問題抱歉。 – sdanna 2010-06-16 21:40:13

+0

@Estaban Araya - 參考OP:「有沒有辦法判斷我的values數組是否有足夠的對象來覆蓋格式化程序」。這就是上述解決方案所做的,我提供了一些例子來證明它。我不知道你還在期待什麼。顯然,它解決了OP的問題,因爲他們接受了它。 – dcp 2010-06-16 21:40:30

0

使用正則表達式來計算模板的數量,但要小心,因爲

string.Format("{0}{0}", 123) 

是有效的。

你真的需要提供更多信息的要回答這個問題,確定...

+0

而{{}}則意味着用單個大括號替換。 – 2010-06-16 21:01:30

0

你可以做支架格式化一個正則表達式,然後比較它們的值數組的長度。

+2

我不認爲正則表達式是一個非常強大的解決方案。例如,設想所有可能的格式化字符串中的佔位符,例如'{0:yyyy-MM-dd}'或轉義括號'{{{0} {}}},這會使正則表達式哭泣,失敗。 – Skurmedel 2010-06-16 21:03:56

2

我想你太擔心這個了。如果格式字符串無效,則讓string.Format爲您拋出異常。如果你不想要FormatException被拋出,抓住它並拋出你想要的異常。

它也應該不是一個問題,你已經做了一些處理(例如,評估lambda轉換),因爲畢竟這是例外情況(可能有一個例外,lambda非常昂貴,在在這種情況下,先執行string.Format測試,而不處理參數以檢查它是否有效,然後在處理後需要時重複該參數)。

+0

誠然,這是一個特例。如果它是我爲自己寫的代碼,我可能會使用這種方法,因爲......我知道它是如何工作的,因爲我寫了它。其中一個額外的輸入是一個列表,我正在與其他開發人員一起寫這個方法,所以在這種情況下能夠快速返回將是我理想的解決方案,因爲不知道如何使用這個方法。 – sdanna 2010-06-16 21:38:10

相關問題