Frage

Bei einem zusammengesetzten Format-String vom Benutzer zur Verfügung gestellt (für die Verwendung mit String.Format) und einer Reihe von Arten, die Argumente darstellen, die verwendet werden, würden den zusammengesetzten Format-String formatiert werden, wie können Sie prüfen, ob der vom Benutzer bereitgestellte Wert gültig ist?

Es sollte ziemlich einfach sein, einen regulären Ausdruck zu erstellen um zu überprüfen, dass die allgemeine Syntax des Argument Platzhalter Übereinstimmen „{index[,alignment][:formatString]}“ pro die Dokumentation . Und nicht zu viel schwieriger zu überprüfen, ob die Indizes des Platzhalter in dem Composite-Format-String sind kleiner als die tatsächliche Anzahl der getippten Argumente (das heißt sie kein Argument verweisen, die gegeben werden, werden nicht). Allerdings sind die Typen für die Argumente gegeben, die in sind dafür bekannt, werden übergeben wird, sollte es auch möglich sein, die „:formatString“ ist für diese Typen angemessen zu überprüfen.

Zum Beispiel wollen Sie den Benutzer nicht validiert „{0:dddd MMMM}“ als Format-String angeben, wenn der erste Argument Typ (0 Index) ist eine Zahl (String.Format("{0:dddd MMMM}", 1234) yields „dddd MMMM“). Die Menge der „:formatString“ Optionen nach Typ ist zu groß wollen manuell alles überprüfen. Gibt es eine andere Möglichkeit? Oder haben Sie nur noch potenziell mit den Benutzern leben ein falsches Format String angibt?

Angenommen, es gibt keine benutzerdefinierte IFormatProvider , ICustomFormatter oder IFormattable Implementierungen im Spiel hier. Gerade Grundtypen bereits in .NET Framework. Bonuspunkte für die Adressierung des benutzerdefinierten Zeug.

War es hilfreich?

Lösung

Es gibt keine eingebaute Möglichkeit, dies zu tun, AFAIK.

Sie können jeden gemeinsamen Fall manuell codieren, aber ich würde es nicht empfehlen.

( Bearbeiten ) Eine pragmatische Option könnte try/catch werden - testen Sie das Format so früh wie möglich, wenn der Benutzer gibt es ....

Andere Tipps

Es tut uns Leid, aber die Art und Weise, es zu tun:

try { string.Format(godKnowsWhat, aBunchOfArguments); }
catch(FormatException) { // use exception for control flow lol }

Ja, irgendwie schlecht.

Wenn schlechter Format-String vom Benutzer angegebene Ausnahme dazu führen könnte, dann vielleicht können Sie es einfach ausprobieren? Ja, es ist naiv und triviale Idee.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top