String.Format per Objekt-Eigenschaften 👍 👎

Jeder C#-Entwickler wird sicherlich bereits die eine oder andere Überladung der String.Format-Methode verwendet haben – ansonsten wird es auf jeden Fall höchste Zeit, sich damit zu beschäftigen. Beispiel:
String.Format verwenden
0102030405
string message = String.Format("{0} ist {1} Jahre alt und besitzt {2:C}.",    "Bernd",    35,    1234.56);  // "Bernd ist 35 Jahre alt und besitzt 1234,56 €."
Noch etwas bequemer – insbesondere auch im Zusammenhang mit anonymen Typen – wäre es jedoch, die Eigenschaften eines Objekts als Ersetzungsdaten verwenden zu können. Wir werden uns dazu eine (nicht ernsthaft optimierte) Erweiterungsmethode für den Typ String schreiben, welche auf Reflexion setzt:
FormatByObject implementieren
01020304050607080910111213
public static string FormatByObject(this string str, object obj) {    StringBuilder stringBuilder = new StringBuilder(str);    {        foreach(PropertyInfo propertyInfo in obj.GetType().GetProperties()) {            stringBuilder.Replace(                "{" + propertyInfo.Name + "}",                propertyInfo.GetValue(obj).ToString()            );        }    }
return stringBuilder.ToString();}
Nun können wir statt numerischer Indizes komfortablere Zeichenketten verwenden:
FormatByObject verwenden
0102030405
message = "{Name} ist {Age} Jahre alt und besitzt {Balance} €.".FormatByObject(new {    Name = "Bernd",    Age = 35,    Balance = 1234.56});  // "Bernd ist 35 Jahre alt und besitzt 1234,56 €€."
Dieses sehr einfache Vorgehen unterstützt jedoch bei Weitem nicht alle Möglichkeiten der ursprünglichen Implementierung, so ist beispielsweise kein {Balance:C} zur Währungsformatierung möglich. Dies könnte dadurch behoben werden, indem wir unsere erweiterte Formatierung auf das Basisformat zurückführen – sprich, die Zeichenketten durch einen Index ersetzen. Ich werde dies in einem separaten Beitrag noch einmal aufgreifen.


Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche