2009-04-01 5 views
4

Geben Sie eine vom Benutzer bereitgestellte zusammengesetzte Formatzeichenfolge (zur Verwendung mit String.Format) und eine Reihe von Typen an, die die Argumente zum Formatieren der zusammengesetzten Formatzeichenfolge darstellen. Wie können Sie überprüfen, ob der vom Benutzer bereitgestellte Wert gültig ist?Wie validiert man eine zusammengesetzte Formatzeichenfolge in C# gegen die Zielargumenttypen?

Es sollte ziemlich einfach sein, einen regulären Ausdruck zu erstellen, um zu überprüfen, ob die allgemeine Syntax der Argumentplatzhalter "{index[,alignment][:formatString]}" per the documentation entspricht. Und nicht zu viel schwieriger zu überprüfen, dass die Indizes der Platzhalter in der zusammengesetzten Formatzeichenfolge kleiner als die tatsächliche Anzahl der eingegebenen Argumente sind (d. H. Sie verweisen nicht auf ein Argument, das nicht angegeben wird). Da jedoch die Typen für die Argumente, die übergeben werden sollen, bekannt sind, sollte es auch möglich sein, zu validieren, ob ":formatString" für diese Typen geeignet ist.

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 Anzahl der ":formatString" Optionen nach Typ ist too large, um alles manuell überprüfen zu wollen. Gibt es einen anderen Weg? Oder müssen Sie nur mit dem Benutzer leben, der möglicherweise eine falsche Formatzeichenfolge angibt?

Angenommen, es gibt keine benutzerdefinierten IFormatProvider, ICustomFormatter oder IFormattable Implementierungen im Spiel hier. Nur grundlegende Typen, die bereits in .NET Framework enthalten sind. Bonuspunkte für die Adressierung der benutzerdefinierten Sachen.

Antwort

5

Es gibt keine eingebaute Methode, dies zu tun, AFAIK.

Sie könnten jeden allgemeinen Fall manuell codieren, aber ich empfehle es nicht.

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

+0

Das ist, was ich vermeiden möchte. – iammichael

+0

Ich möchte nicht wirklich die Regex für die Platzhalter machen! – iammichael

4

Sorry, aber die Art und Weise, es zu tun ist:

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

Ja, ein bisschen schlecht.

+0

Ich habe Typen, keine Instanzen der Typen, zu dem Zeitpunkt, zu dem das Format validiert werden muss, so dass es keine "aBunchOfArguments" geben kann. – iammichael

+0

Re "Instanzen von Typen" ... Activator.CreateInstance; -p –

+0

Ja, Sie müssen Instanzen mit Reflektion erstellen, wenn Sie diese Methode verwenden möchten. – mquander

1

Wenn eine vom Benutzer angegebene fehlerhafte Formatzeichenfolge eine Ausnahme verursachen kann, dann können Sie es vielleicht einfach ausprobieren? Ja, es ist eine naive und triviale Idee.

Verwandte Themen