Question Comment imiter string.Format () dans ma propre méthode?


J'ai un objet avec une coutume WriteLine(string) méthode. Quelque chose comme ça:

public void WriteLine(string text)
{
    this.StringList.Add(text);
}

Quel est le moyen le plus simple de dupliquer les fonctionnalités de string.Format() avec cette méthode? Par exemple: Ce que je me trouve souvent en train de faire, c'est ceci:

myObj.WriteLine(string.Format("Hello, {0}", name));

Si vous créez une nouvelle application console, sa version d'un WriteLine() méthode fait exactement ce que je préférerais faire:

Console.WriteLine("Hello, {0}", name);

Ils éliminent le besoin d'appeler string.Format(). Est-ce facile de faire accepter cette méthode d'une manière ou d'une autre? Ou vais-je devoir créer mille surcharges de méthode? Quelque chose comme ça:

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

Est-ce la seule façon logique de le faire? Toutes les suggestions sont les bienvenues :)


37
2017-09-14 19:47


origine


Réponses:


Vous devez copier la signature de la méthode à partir de string.format.

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

Comme suggéré par ChaosPandion, vous pouvez également inclure des surcharges pour empêcher la création de tableaux

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));
}

Je ne dépasserais pas arg2 car string.format ne fait pas disparaître le bénéfice.


61
2017-09-14 19:50



Vous pourriez utiliser params:

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

7
2017-09-14 19:51



Il y a un avantage que vous pourriez vouloir éviter. Le code suivant va écrire la chaîne {0} à la console

Console.WriteLine("{0}");

Cependant, vous utilisez l’une des implémentations de WriteLine suggérées par d’autres utilisateurs dans cette réponse, ces implémentations généreront une exception:

WriteLine("{0}"); //throws exception

La solution la plus simple consiste soit à avoir deux surcharges de WriteLine, soit à modifier légèrement le code suggéré pour gérer la casse:

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

7
2017-09-14 21:22