Comment pouvez-vous valider une chaîne de format composite en C # par rapport à ses types d'arguments cible?

StackOverflow https://stackoverflow.com/questions/707163

  •  22-08-2019
  •  | 
  •  

Question

Étant donné une chaîne de format composite fourni par l'utilisateur (pour une utilisation avec String.Format) et un ensemble de types représentant les arguments qui seraient utilisés pour formater la chaîne de format composite, comment pouvez-vous vérifier que la valeur fournie par l'utilisateur est valide?

Il devrait être assez facile de créer une expression régulière pour vérifier que la syntaxe générale des espaces réservés argument correspondant à « {index[,alignment][:formatString]} » par la documentation . Et pas trop beaucoup plus difficile de vérifier que les indices des caractères génériques dans la chaîne de format composite est inférieur au nombre réel d'arguments typés (à savoir qu'ils ne référencent pas un argument qui ne sera pas donné). Toutefois, compte tenu des types pour les arguments qui seront transmis en sont connus, il devrait également être possible de valider le « :formatString » est approprié pour ces types.

Par exemple, vous souhaitez valider l'utilisateur ne spécifie pas « {0:dddd MMMM} » en tant que chaîne de format lorsque le premier type d'argument (0 index) est un nombre (rendements String.Format("{0:dddd MMMM}", 1234) « dddd MMMM »). La quantité de « :formatString » options par type est trop grand vouloir vérifier manuellement tout. Est-ce qu'il y a un autre moyen? Ou avez-vous juste vivre avec l'utilisateur en spécifiant potentiellement une mauvaise chaîne de format?

On suppose qu'il n'y a pas coutume IFormatProvider , ICustomFormatter ou les implémentations de IFormattable en jeu ici. types Juste base déjà dans le .NET Framework. Les points bonus pour aborder les choses personnalisées.

Était-ce utile?

La solution

Il n'y a aucun moyen de le faire intégré, autant que je sache.

Vous pouvez coder manuellement tous les cas communs, mais je ne le recommande pas.

( modifier ) Une option pragmatique pourrait être try/catch - tester le format le plus tôt possible lorsque l'utilisateur entre elle ....

Autres conseils

Désolé, mais la façon de le faire est:

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

Oui, un peu mal.

Si la mauvaise chaîne de format spécifiée par l'utilisateur pourrait faire exception, vous pouvez peut-être juste essayer? Oui, il est idée naïve et trivial.

scroll top