Come si fa a convalidare una stringa di formato composita in C # contro i suoi tipi di argomenti di destinazione?

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

  •  22-08-2019
  •  | 
  •  

Domanda

Data una stringa di formato composito fornito dall'utente (per l'uso con String.Format) e un insieme di tipi che rappresentano gli argomenti che sarebbero stati utilizzati per formattare la stringa di formato composito, come è possibile verificare che il valore fornito dall'utente è valido?

Dovrebbe essere abbastanza facile per creare un'espressione regolare per verificare che la sintassi generale dei segnaposti argomento corrisponde "{index[,alignment][:formatString]}" per la documentazione . E non troppo più difficile verificare che gli indici dei segnaposto nella stringa di formato composito sono inferiori al numero effettivo di argomenti digitati (cioè esse non fanno riferimento un argomento che non sarà dato). Tuttavia, dati i tipi per gli argomenti che verranno trasmessi sono noti, dovrebbe anche essere possibile validare il ":formatString" è adatto per quei tipi.

Per esempio, si desidera convalidare l'utente non specifica "{0:dddd MMMM}" come una stringa di formato quando il primo tipo di argomento (0 index) è un numero (rendimenti String.Format("{0:dddd MMMM}", 1234) "dddd MMMM"). La quantità di opzioni ":formatString" di tipo è troppo grande a voler controllare manualmente ogni cosa. C'è un altro modo? O avete solo vivere con l'utente potenzialmente specificare una stringa di formato cattivo?

Si supponga ci sono personalizzato IFormatProvider , ICustomFormatter o implementazioni IFormattable in gioco qui. Proprio tipi di base già in .NET Framework. Punti bonus per affrontare la roba personalizzato.

È stato utile?

Soluzione

Non c'è un modo integrato di fare questo, per quanto ne so.

Si potrebbe codice ogni caso comune manualmente, ma io non lo consiglio.

( modifica ) Una possibilità potrebbe essere pragmatica try/catch - testare il formato più presto possibile quando l'utente immette lo ....

Altri suggerimenti

Siamo spiacenti, ma il modo per farlo è:

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

Sì, un po 'male.

Se stringa di formato cattiva specificata dall'utente potrebbe causare un'eccezione, allora forse si può solo provare? Sì, è un'idea ingenua e banale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top