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.
Das ist, was ich vermeiden möchte. – iammichael
Ich möchte nicht wirklich die Regex für die Platzhalter machen! – iammichael