¿Cómo se puede validar una cadena de formato compuesta en C # en contra de sus tipos de argumento objetivo?

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

  •  22-08-2019
  •  | 
  •  

Pregunta

Dada una cadena formato compuesto proporcionado por el usuario (para su uso con String.Format) y un conjunto de tipos que representan los argumentos que se utilizarían para dar formato a la cadena de formato compuesto, ¿cómo se puede comprobar que el valor proporcionado por el usuario es válido?

Debe ser bastante fácil de crear una expresión regular para comprobar que la sintaxis general de los marcadores de posición de argumento coincide con "{index[,alignment][:formatString]}" por la documentación . Y no mucho más difícil de verificar que los índices de los marcadores de posición en la cadena de formato compuesto es menor que el número real de argumentos escritos (es decir, que no hacen referencia a un argumento que no va a ser dada). Sin embargo, dados los tipos de los argumentos que se pasarán en que se conoce, también debería ser posible validar el ":formatString" es adecuada para esos tipos.

Por ejemplo, desea validar el usuario no especifica "{0:dddd MMMM}" como cadena de formato cuando el primer argumento de tipo (índice 0) es un número (rendimientos String.Format("{0:dddd MMMM}", 1234) "dddd MMMM"). La cantidad de opciones ":formatString" por tipo es demasiado grande que desea comprobar manualmente todo. ¿Hay alguna otra manera? ¿O simplemente tiene que vivir con el usuario potencialmente especificando una cadena de formato malo?

Supongamos que hay ninguna costumbre IFormatProvider , ICustomFormatter o implementaciones IFormattable en juego aquí. Sólo los tipos básicos que ya están en el .NET Framework. Los puntos de bonificación para hacer frente a las cosas personalizadas.

¿Fue útil?

Solución

No hay manera innata de hacer esto, que yo sepa.

Se puede codificar cada caso común de forma manual, pero yo no lo recomiendo.

( editar ) Una opción pragmática podría ser try/catch - probar el formato tan pronto como sea posible cuando el usuario entra en ella ....

Otros consejos

Lo sentimos, pero la manera de hacerlo es:

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

Sí, un poco mal.

Si mal cadena de formato especificado por el usuario podría provocar una excepción, entonces tal vez usted puede probarlo? Sí, es ingenua idea y trivial.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top