C# で複合フォーマット文字列をターゲット引数の型に対してどのように検証しますか?
-
22-08-2019 - |
質問
ユーザーが提供した複合フォーマット文字列を指定します ( String.Format
) と、複合書式文字列の書式設定に使用される引数を表す型のセットがある場合、ユーザーが指定した値が有効であることをどのように確認できますか?
正規表現を作成して、引数プレースホルダーの一般的な構文が一致することを確認するのは非常に簡単です。{index[,alignment][:formatString]}
「あたり 文書. 。また、複合フォーマット文字列内のプレースホルダーのインデックスが、型指定された引数の実際の数よりも小さいことを検証することも、それほど難しいことではありません。与えられない引数は参照しません)。ただし、渡される引数の型がわかっている場合、「:formatString
」というタイプに適しています。
たとえば、ユーザーが「」を指定していないことを検証したいとします。{0:dddd MMMM}
最初の引数の型 (0 インデックス) が数値の場合、書式文字列として " (String.Format("{0:dddd MMMM}", 1234)
結果は「」dddd MMMM
")。の量は、:formatString
" タイプ別のオプションは 大きすぎる すべてを手動で確認したい場合。他に方法はありますか?それとも、ユーザーが間違ったフォーマット文字列を指定する可能性があることを我慢しなければならないのでしょうか?
カスタムはないと仮定します IFormatProvider
, ICustomFormatter
または IFormattable
ここで実装されています。.NET Framework にすでに含まれている基本的な型だけです。カスタム内容に対処するとボーナスポイントが得られます。
解決
私の知る限り、これを行う組み込みの方法はありません。
すべての一般的なケースを手動でコーディングすることもできますが、お勧めしません。
(編集) 現実的なオプションの 1 つは次のとおりです。 try/catch
- ユーザーがフォーマットを入力したら、できるだけ早くフォーマットをテストします。
他のヒント
申し訳ありませんが、その方法は次のとおりです。
try { string.Format(godKnowsWhat, aBunchOfArguments); }
catch(FormatException) { // use exception for control flow lol }
うん、ちょっと悪いね。
ユーザーが指定した不正なフォーマット文字列が例外を引き起こす可能性がある場合は、それを試してみることはできますか?はい、それは素朴でつまらない考えです。