Como você validar uma seqüência de formato composto em C # contra os seus tipos de argumentos alvo?
-
22-08-2019 - |
Pergunta
Dada uma seqüência de formato composto fornecido pelo usuário (para uso com String.Format
) e um conjunto de tipos que representam os argumentos que seriam usados ??para formatar a seqüência de formato composto, como você pode verificar que o valor fornecido pelo usuário é válido?
Deve ser muito fácil criar uma expressão regular para verificar se a sintaxe geral dos espaços reservados argumento corresponder "{index[,alignment][:formatString]}
" per a documentação . E não muito mais difícil para verificar se os índices dos espaços reservados na seqüência de formato composto são menos do que o número real de argumentos digitados (ou seja, eles não fazem referência a um argumento que não será dado). No entanto, dados os tipos para os argumentos que serão passados ??em são conhecidos, deve também ser possível validar o ":formatString
" é apropriado para esses tipos.
Por exemplo, você quer validar o usuário não especifica "{0:dddd MMMM}
" como uma seqüência de formato quando o primeiro tipo de argumento (0 index) é um número (yields String.Format("{0:dddd MMMM}", 1234)
"dddd MMMM
"). A quantidade de opções ":formatString
" por tipo é muito grande querer verificar manualmente tudo. Existe alguma outra maneira? Ou você só tem que viver com o usuário potencialmente especificando uma seqüência de formato ruim?
Suponha que não há costume IFormatProvider
, ICustomFormatter
ou implementações IFormattable
em jogo aqui. Apenas tipos básicos já no .NET Framework. Os pontos de bónus para lidar com o material personalizado.
Solução
Não há nenhuma maneira inerente de fazer isso, AFAIK.
Você pode codificar cada caso comum manualmente, mas eu não recomendo.
( Editar ) Uma opção pragmática poderia ser try/catch
- teste o formato o mais cedo possível quando o usuário digita-lo ....
Outras dicas
Desculpe, mas a maneira de fazer isso é:
try { string.Format(godKnowsWhat, aBunchOfArguments); }
catch(FormatException) { // use exception for control flow lol }
Sim, meio ruim.
Se format string ruim especificado pelo usuário poderia causar exceção, então talvez você pode apenas experimentá-lo? Sim, é idéia ingênua e trivial.