2011-09-14 19 views
37

我有一個自定義WriteLine(string)方法的對象。事情是這樣的:如何在我自己的方法中模仿string.Format()?

public void WriteLine(string text) 
{ 
    this.StringList.Add(text); 
} 

這有什麼方法來複制的string.Format()功能最簡單的方法?例如:我現在經常發現自己做的事情是這樣的:

myObj.WriteLine(string.Format("Hello, {0}", name)); 

如果您創建一個新的控制檯應用程序的一個WriteLine()方法的版本不正是我寧願做:

Console.WriteLine("Hello, {0}", name); 

他們無需致電string.Format()。以某種方式讓你的方法接受這件事很容易嗎?或者我將不得不創建一千個方法重載?類似這樣的:

public void WriteLine() { ... } 

public void WriteLine(string text) { ... } 

public void WriteLine(string text, object arg0) { ... } 

public void WriteLine(string text, object arg0, object arg1) { ... } 

public void WriteLine(string text, object arg0, object arg1, object arg2) 
{ 
    this.StringList.Add(string.Format(text, arg0, arg1, arg2)); 
} 

// etc etc etc 

這是唯一合乎邏輯的方法嗎?歡迎任何建議:)

+1

爲什麼不只是委託給'string.Format'?你真的想寫一個標記器嗎? – Oded

+10

C#有一個你不瞭解的特性,你需要知道的。 http://msdn.microsoft.com/en-us/library/w5zay9db(v=VS.100).aspx –

+0

@Oded這是我的問題......我不知道'params'關鍵字,並不知道我甚至***可以***委託給'string.Format'。 – Chev

回答

60

您需要從string.format複製方法簽名。

public void WriteLine(string text,params object[] args) { 
    this.StringList.Add(string.Format(text,args)); 
} 

正如ChaosPandion建議您還可以包括過載,防止陣列創建

public void WriteLine(string text) { 
    this.StringList.Add(text); 
} 

public void WriteLine(string text,object arg0) { 
    this.StringList.Add(string.Format(text, arg0)); 
} 

public void WriteLine(string text,object arg0, object arg1) { 
    this.StringList.Add(string.Format(text, arg0, arg1)); 
} 

public void WriteLine(string text,object arg0, object arg1, object arg2) { 
    this.StringList.Add(string.Format(text, arg0, arg1, arg2)); 
} 

爲的String.Format不那麼好處消失,我不會走過去ARG2。

+0

完美!在浪費時間做一些乏味的事情之前,我花時間提出一個恰當的問題,我總是很高興。幾乎總是有更好的方法。謝謝! – Chev

+2

我會添加重載以避免簡單情況下的數組創建。也許最多4個參數。 – ChaosPandion

+0

@ChaosPandion好的建議。我接受了你的建議。 – Chev

6

你可以使用params

public void WriteLine(string text, params object[] parameters) 
{ 
    //.. 
} 
7

有你可能要採取的痛苦,避免一個邊緣情況。下面的代碼將寫入字符串{0}控制檯

Console.WriteLine("{0}"); 

但是,您使用的WriteLine的其他人在這個答案提出的實現方式之一,這些實現將拋出一個異常:

WriteLine("{0}"); //throws exception 

最簡單的解決方法是要麼具有的WriteLine的兩個重載或稍微修改建議的代碼來處理邊緣情況:

public void WriteLine(string text,params object[] args) { 
    var message=args.Length==0 ? text : string.Format(text, args); 
    this.StringList.Add(message); 
} 
+0

我已經有一個重載只是字符串,所以這對我來說不是問題。感謝您的關注:) – Chev

相關問題