Как вы проверяете составную строку формата в C # относительно ее целевых типов аргументов? - PullRequest
4 голосов
/ 02 апреля 2009

Учитывая строку составного формата, предоставленную пользователем (для использования с String.Format), и набор типов, представляющих аргументы, которые будут использоваться для форматирования строки составного формата, как вы можете проверить, что предоставленное пользователем значение действительный

Должно быть довольно легко создать регулярное выражение, чтобы проверить, что общий синтаксис заполнителей аргументов соответствует "{index[,alignment][:formatString]}" для документации . И не намного сложнее проверить, что индексы заполнителей в строке составного формата меньше, чем фактическое число типизированных аргументов (т.е. они не ссылаются на аргумент, который не будет задан). Однако, учитывая, что типы для аргументов, которые будут переданы, известны, также должна быть возможность проверить, что «:formatString» подходит для этих типов.

Например, вы хотите проверить, что пользователь не указывает «{0:dddd MMMM}» в качестве строки формата, когда первый тип аргумента (индекс 0) - это число (String.Format("{0:dddd MMMM}", 1234) возвращает «dddd MMMM»). Количество опций ":formatString" по типу слишком велико , чтобы захотеть все вручную проверить. Есть ли другой путь? Или вам просто нужно жить с пользователем, который может указывать неверный формат строки?

Предположим, что здесь нет пользовательских реализаций IFormatProvider, ICustomFormatter или IFormattable. Просто базовые типы уже в .NET Framework. Бонусные баллы за решение нестандартных задач.

Ответы [ 3 ]

5 голосов
/ 02 апреля 2009

Нет встроенного способа сделать это, AFAIK.

Вы можете кодировать каждый общий случай вручную, но я не рекомендую его.

( edit ) Один из прагматических вариантов может быть try/catch - проверить формат как можно раньше, когда пользователь вводит его ....

4 голосов
/ 02 апреля 2009

Извините, но способ сделать это:

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

Да, вроде плохо.

1 голос
/ 02 апреля 2009

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

...