Como você validar uma seqüência de formato composto em C # contra os seus tipos de argumentos alvo?

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

  •  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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top