Как подражать 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
Это единственный логический способ сделать это? Любые предложения приветствуются:)
Ответы
Ответ 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)
{
//..
}