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

Che*_*hev 39 .net c# asp.net string methods

我有一个自定义WriteLine(string)方法的对象.像这样的东西:

public void WriteLine(string text)
{
    this.StringList.Add(text);
}
Run Code Online (Sandbox Code Playgroud)

string.Format()使用此方法复制功能的最简单方法是什么?例如:我目前经常发现自己在做的是:

myObj.WriteLine(string.Format("Hello, {0}", name));
Run Code Online (Sandbox Code Playgroud)

如果您创建一个新的控制台应用程序,他们的WriteLine()方法版本完全符合我的要求:

Console.WriteLine("Hello, {0}", name);
Run Code Online (Sandbox Code Playgroud)

他们不需要打电话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
Run Code Online (Sandbox Code Playgroud)

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

Bob*_*ale 63

您需要从string.format复制方法签名.

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

根据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));
}
Run Code Online (Sandbox Code Playgroud)

我不会越过arg2作为string.format不会因此消失.

  • 我会添加重载以避免在简单情况下创建数组.也许最多4个参数. (2认同)

Bro*_*ass 7

你可以使用params:

 public void WriteLine(string text, params object[] parameters)
 {
     //..
 }
Run Code Online (Sandbox Code Playgroud)


Cor*_*sak 7

有一个边缘情况你可能想要避免痛苦.以下代码将字符串{0}写入控制台

Console.WriteLine("{0}");
Run Code Online (Sandbox Code Playgroud)

但是,您在本答案中使用其他人建议的WriteLine实现之一,这些实现将引发异常:

WriteLine("{0}"); //throws exception
Run Code Online (Sandbox Code Playgroud)

最简单的解决方法是要么有两次WriteLine重载,要么稍微修改建议的代码来处理边缘情况:

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