Как вы проверяете строку составного формата в C # на соответствие ее целевым типам аргументов?

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

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

Да, довольно плохо.

Если строка неправильного формата, указанная пользователем, может вызвать исключение, то, может быть, вы можете просто попробовать это?Да, это наивная и тривиальная идея.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top