Как вы проверяете строку составного формата в 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.Бонусные баллы за обращение к пользовательским материалам.
Решение
Встроенного способа сделать это не существует, AFAIK.
Вы могли бы закодировать каждый распространенный случай вручную, но я не рекомендую этого делать.
(Редактировать) Одним из прагматичных вариантов может быть try/catch
- протестируйте формат как можно раньше, когда пользователь вводит его....
Другие советы
Извините, но способ сделать это таков:
try { string.Format(godKnowsWhat, aBunchOfArguments); }
catch(FormatException) { // use exception for control flow lol }
Да, довольно плохо.
Если строка неправильного формата, указанная пользователем, может вызвать исключение, то, может быть, вы можете просто попробовать это?Да, это наивная и тривиальная идея.