Как имитировать string.Format () в моем собственном методе? - PullRequest
39 голосов
/ 14 сентября 2011

У меня есть объект с пользовательским 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 ]

63 голосов
/ 14 сентября 2011

Вам необходимо скопировать подпись метода из 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 этого не делает, поэтому выгода исчезает.

7 голосов
/ 15 сентября 2011

Существует один крайний случай, который вы могли бы попытаться избежать.Следующий код запишет строку {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);
}
7 голосов
/ 14 сентября 2011

Вы можете использовать params:

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