Nachdem ich darüber nachgedacht hatte, realisierte ich, was ich mir eigentlich wünschte, dass String.Format() ein IDictionary als Argument nehmen würde, und dass Templates mit Namen anstelle von Indizes geschrieben werden könnten.
Bei String-Substitutionen mit vielen möglichen Schlüsseln/Werten führen die Indexnummern zu unleserlichen String-Vorlagen - und in einigen Fällen wissen Sie vielleicht nicht einmal, welche Artikel welche Nummer haben werden Erweiterung:
https://gist.github.com/896724
Grundsätzlich können Sie auf diese Zeichenketten-Templates mit Namen statt Nummern und ein Wörterbuch anstelle eines Arrays, verwenden und können Sie alle anderen guten Eigenschaften von String haben.Format(), die Verwendung eines benutzerdefinierten IFormatProvider, falls erforderlich, und die Verwendung aller üblichen Formatierungssyntax - Genauigkeit, Länge, etc.
Die example im Referenzmaterial für String.Format ist eine große Beispiel dafür, wie Vorlagen mit vielen nummerierten Elemente geworden völlig unleserlich - das Beispiel der Portierung dieser neuen Erweiterung Methode zu verwenden, können Sie so etwas wie dieses:
var replacements = new Dictionary<String, object>()
{
{ "date1", new DateTime(2009, 7, 1) },
{ "hiTime", new TimeSpan(14, 17, 32) },
{ "hiTemp", 62.1m },
{ "loTime", new TimeSpan(3, 16, 10) },
{ "loTemp", 54.8m }
};
var template =
"Temperature on {date1:d}:\n{hiTime,11}: {hiTemp} degrees (hi)\n{loTime,11}: {loTemp} degrees (lo)";
var result = template.Subtitute(replacements);
Als jemand darauf hingewiesen, wenn das, was Sie Bedürfnisse gerade schreiben hoch sein Optimiert, verwenden Sie nicht so etwas - Wenn Sie Millionen von Strings auf diese Weise in einer Schleife formatieren müssen, könnte der Speicher- und Performance-Overhead erheblich sein.
Auf der anderen Seite, wenn Sie besorgt über lesbare, wartbare Code schreiben - und wenn Sie, sagen wir, eine Reihe von Datenbank-Operationen, im großen Schema der Dinge, diese Funktion wird keine signifikanten hinzufügen Overhead.
...
Der Einfachheit halber habe ich versucht, eine Methode hinzuzufügen, die ein anonymes Objekt anstelle eines Wörterbuchs akzeptieren würde:
public static String Substitute(this String template, object obj)
{
return Substitute(
template,
obj.GetType().GetProperties().ToDictionary(p => p.Name, p => p.GetValue(obj, null))
);
}
Aus irgendeinem Grund, dies nicht funktioniert - Weitergabe Ein anonymes Objekt wie new { name: "value" }
zu dieser Erweiterungsmethode gibt eine Fehlermeldung zur Kompilierungszeit, die besagt, dass die IDictionary-Version der Methode die beste Übereinstimmung ist. Nicht sicher, wie das zu beheben ist. (jemand?)
+1 für die Dinge auf die einfache Art und Weise :) –
(Obwohl Sie bedeuten, ersetzen (Muster, "Mike")) –
@Jon: Danke. Warum einen Compiler verwenden, wenn du einen Jon hast? ;-) –