2014-01-23 113 views
19

是否可以向字符串格式說明符中添加一些描述性文本?字符串格式描述文本

實施例:

string.Format ("{0:ForeName} is not at home", person.ForeName); 

在該示例ForeName被添加作爲說明。

上面的語法顯然是不正確的,但只是爲了顯示這個想法。

我問其原因,是因爲在我的情況的字符串是在資源文件中,所以在資源文件中,您目前只能看到

{0} is not at home 
在某些情況下,這是很難

上把握上下文{0}是。

編輯:

在C#6串插與$運營商已經出臺,所以string.Format不需要了:

$"{person.ForeName} is not at home"; 
+2

您希望正在閱讀代碼的開發人員知道「{0}」中發生了什麼,就是這樣嗎?一種評論? – Johnny5

+1

這裏有什麼意圖? – crush

+7

只是谷歌「字符串格式命名參數」。沒有原生的方法,只有解決方法。 http://stackoverflow.com/questions/159017/named-string-formatting-in-c-sharp –

回答

14

我們通常會將評論放入我們的資源文件中,例如{0} = Forename

然後,任何人可能會翻譯字符串知道什麼{0}代表,並可以相應地翻譯。

此外,如果您使用ReSharper,則可以在將字符串添加到資源時同時輸入註釋。

+0

謝謝,我使用了Resharper,所以很瞭解! – thumbmunkeys

+0

有時最好的解決方案是簡單的 – Johnny5

2
string.Format ("{0} is not at home {1} ", person.ForeName, person.Something); 

這應打印用的名字,而不是{ 0}以及{1}中的內容。如你所說,沒有辦法。

+12

我認爲作者理解'string.Format'是如何工作的。 – crush

+0

對不起,我的問題更清晰 – thumbmunkeys

5

這沒有內置的C#函數。我建議最好是插入註釋(這將在不影響性能):

string.Format ("{0"/*ForeName*/+"} is not at home", person.ForeName); 

Personnaly,我並不覺得可讀,最好的計算策略是使用第三方工具大衛Khaykin (見this answer

+0

謝謝,但重點是描述應該在字符串中,所以它進入資源文件 – thumbmunkeys

+0

我喜歡這個「沒有性能影響」部分。但作者正在談論資源文件。我們可以在資源文件中添加註釋嗎? – Johnny5

+0

@ Johnny5可以給resx文件條目添加註釋,所以這是一個可行的選項,只是在那裏發表評論 – thumbmunkeys

8

對於字符串您的方法應該工作,因爲字符串將忽略任何格式說明符。然而,你跑不小心使用,對於非字符串類型的風險,在這種情況下,字符串要麼被翻譯成格式代碼或字面上顯示:

string.Format ("{0:ForeName} is not at home", "Johnny"); 
//"Johnny is not at home" 

string.Format ("{0:ForeName} will be home at {1:HomeTime}", "Johnny", DateTime.Today) 
//Johnny will be home at 0o0eTi0e -- H, h, and m are DateTime format codes. 

但是因爲你在一個資源存儲這些文件,我會使用資源文件中的「註釋」字段 - 您可以存儲格式字符串的副本並在其中添加您的描述。

14

Phil Haack和Peli寫了一些關於默認string.format函數替代方法的有趣博客文章。他們可能會感興趣。

他們基本上允許您使用格式字符串像這裏面的對象屬性:

string s = NamedFormat("Hello {FullName} ({EmailAdrress})!", person); 

您可以在相關的博客文章在這裏:

也許這些博客文章中涵蓋的解決方案之一可以滿足您的需求。

+0

1st是一個死鏈接 – iambriansreed

5

IDEOne.com demo

這是一個有點天真實施StackOverflow上的formatUnicorn方法:

using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 
using System.Reflection; 

public class Test 
{ 
    public static void Main() 
    { 
     string formatString = "{firstName} {lastName} is awesome."; 

     Console.WriteLine(formatString.FormatUnicorn(new { 
      firstName = "joe", 
      lastName = "blow" 
     })); 
    } 
} 

public static class StringExtensions { 
    public static string FormatUnicorn(this string str, object arguments) { 
     string output = str; 

     Type type = arguments.GetType(); 

     foreach (PropertyInfo property in type.GetProperties()) 
     { 
      Regex regex = new Regex(@"\{" + property.Name + @"\}"); 
      output = regex.Replace(output, property.GetValue(arguments, null).ToString()); 
     } 

     return output; 
    } 
} 

這裏最大的缺點是使用反射,這可能是緩慢。另一個是它不允許使用格式說明符。

更好的方法可能是創建一個更復雜的正則表達式來刪除註釋。

1

從Visual Studio 2015開始,您可以使用Interpolated Strings(它是一種編譯器技巧,因此您選擇哪種版本的.net框架並不重要)。

然後,該代碼看起來是這樣的

string txt = $"{person.ForeName} is not at home {person.Something}"; 

它不是理想的,如果你想要把字符串到資源文件進行翻譯,但它oftern使代碼更易讀且不易出錯。