2014-01-23 7 views
19

Ist es möglich, einem Zeichenfolgenformatbezeichner beschreibenden Text hinzuzufügen?Beschreibender Text des Zeichenfolge-Formats

Beispiel:

string.Format ("{0:ForeName} is not at home", person.ForeName); 

Im Beispiel wird als ForeName Beschreibung hinzugefügt.

Die obige Syntax ist offensichtlich falsch, aber nur um die Idee zu zeigen.

Der Grund ich frage, ist, weil in meinem Fall die Zeichenfolgen in einer Ressource-Datei sind, so in der Ressource-Datei nur Sie derzeit

{0} is not at home 

in einigen Fällen sehen es schwer zu fassen ist, was der Kontext von {0} ist.

EDIT:

In C# 6 String-Interpolation mit dem $ Operator eingeführt worden ist, so ist string.Format nicht mehr benötigt:

$"{person.ForeName} is not at home"; 
+2

Sie möchten, dass der Entwickler, der den Code liest, weiß, was in '{0}' steckt, das war's? Eine Art Kommentar? – Johnny5

+1

Was ist die Absicht hier? – crush

+7

Googeln Sie einfach "String Format benannte Parameter". Es gibt keine einheimische Methode, dies zu tun, nur Workarounds. http://stackoverflow.com/questions/159017/named-string-formatting-in-c-sharp –

Antwort

14

In der Regel legen wir Kommentare in unsere Ressourcen-Datei, z. {0} = Forename.

Dann jemand, der die Zeichenfolge übersetzen könnte, was {0} darstellt und entsprechend übersetzen kann.

Auch wenn Sie ReSharper verwenden, können Sie den Kommentar gleichzeitig eingeben, wenn Sie Ihre Zeichenfolge zu Ressourcen hinzufügen.

+0

Danke, ich benutze Resharper, so dass es toll ist zu wissen! – thumbmunkeys

+0

Manchmal ist die beste Lösung die einfachere – Johnny5

2
string.Format ("{0} is not at home {1} ", person.ForeName, person.Something); 

Diese den Vornamen drucken werden anstelle von { 0} und etwas in {1}. Es gibt keinen Weg, wie du gesagt hast.

+12

Ich denke, der Autor versteht, wie 'string.Format' funktioniert. – crush

+0

Sorry, ich habe meine Frage klarer gemacht – thumbmunkeys

5

Es gibt keine eingebaute C# -Funktion dafür. Das Beste, was ich vorschlagen kann, ist einen Kommentar einfügen (dies wird keine Auswirkungen auf die Leistung haben):

string.Format ("{0"/*ForeName*/+"} is not at home", person.ForeName); 

personnaly, ich finde es nicht lesbar ist, die beste approch ist ein Drittanbieter-Tool wie David Khaykin zu verwenden Vorschlag im Kommentar (siehe this answer)

+0

danke, aber der Punkt ist, dass die Beschreibung in der Zeichenfolge sein sollte, so dass es in die Ressource-Datei – thumbmunkeys

+0

Ich mag die "No Performance Impact" Teil davon. Aber der Autor redet, wenn Ressourcen Datei. Können wir Kommentare in Ressourcendateien einfügen? – Johnny5

+0

@ Johnny5 ist es möglich, einen Kommentar zu ResX-Dateieinträgen hinzuzufügen, so dass eine praktikable Option ist, es einfach dort zu kommentieren – thumbmunkeys

8

Für Strings sollte Ihre Methode funktionieren, da Strings alle Formatbezeichner ignorieren. Jedoch Sie laufen Gefahr, aus Versehen, dass für Nicht-String-Typen verwenden, wobei in diesem Fall der Zeichenfolge werden entweder als Format-Codes übersetzt werden oder buchstäblich angezeigt:

string.Format ("{0:ForeName} is not at home", "Johnny"); 
//"Johnny is not at home" 

string.Format ("{0:ForeName} will be home at {1:HomeTime}", "Johnny", DateTime.Today) 
//Johnny will be home at 0o0eTi0e -- H, h, and m are DateTime format codes. 

jedoch, da Sie diese in einer Ressource sind speichern Datei, würde ich stattdessen das Feld "Kommentar" in der Ressourcendatei verwenden - Sie könnten eine Kopie der Formatzeichenfolge speichern und dort Ihre Beschreibungen hinzufügen.

14

Phil Haack und Peli haben ein paar interessante Blogposts über Alternativen zur Standardfunktion string.format geschrieben. Sie könnten dich interessieren.

Grundsätzlich können Sie damit Objekteigenschaften in der Format-String wie folgt verwenden:

string s = NamedFormat("Hello {FullName} ({EmailAdrress})!", person); 

Sie können die zugehörigen Blog-Posts hier:

Vielleicht würde eine der Lösungen in diesen Blogposts Ihren Anforderungen entsprechen.

+0

1. ist eine tote Verbindung – iambriansreed

5

IDEOne.com demo

Hier ist eine etwas naive Umsetzung formatUnicorn Methode des Stackoverflow:

using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 
using System.Reflection; 

public class Test 
{ 
    public static void Main() 
    { 
     string formatString = "{firstName} {lastName} is awesome."; 

     Console.WriteLine(formatString.FormatUnicorn(new { 
      firstName = "joe", 
      lastName = "blow" 
     })); 
    } 
} 

public static class StringExtensions { 
    public static string FormatUnicorn(this string str, object arguments) { 
     string output = str; 

     Type type = arguments.GetType(); 

     foreach (PropertyInfo property in type.GetProperties()) 
     { 
      Regex regex = new Regex(@"\{" + property.Name + @"\}"); 
      output = regex.Replace(output, property.GetValue(arguments, null).ToString()); 
     } 

     return output; 
    } 
} 

Der größte Nachteil ist hier die Verwendung von Reflexion, die langsam sein kann. Der andere ist, dass Formatangaben nicht zulässig sind.

Ein besserer Ansatz könnte darin bestehen, einen komplexeren regulären Ausdruck zu erstellen, der nur die Kommentare entfernt.

1

Ab Visual Studio 2015 können Sie dies mit Interpolated Strings tun (es ist ein Compiler-Trick, so dass es keine Rolle spielt, welche Version des .net-Framework Sie anvisieren).

Der Code sieht dann so etwas wie dieses

string txt = $"{person.ForeName} is not at home {person.Something}"; 

Es ist nicht ideal, wenn Sie die Zeichenfolgen in Ressourcendateien für die Übersetzung setzen wollen, aber es macht oftern den Code besser lesbar und weniger fehleranfällig.

Verwandte Themen