如何在我自己的方法中模仿string.Format()?

时间:2011-09-14 19:47:14

标签: c# .net asp.net string methods

我有一个使用自定义WriteLine(string)方法的对象。像这样:

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

这是唯一符合逻辑的方法吗?欢迎任何建议:)

3 个答案:

答案 0 :(得分:63)

您需要从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));
}

我不会超过arg2,因为string.format不会因此消失。

答案 1 :(得分:7)

您可以使用params

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

答案 2 :(得分: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);
}