Подтвердить что ты не робот

Как подражать string.Format() в моем собственном методе?

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

Это единственный логический способ сделать это? Любые предложения приветствуются:)

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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