如何在C#中针对其目标参数类型验证复合格式字符串?

时间:2009-04-01 20:14:09

标签: c# validation string.format

给定用户提供的复合格式字符串(与String.Format一起使用)和一组表示将用于格式化复合格式字符串的参数的类型,如何检查用户提供的价值有效吗?

创建正则表达式以检查参数占位符的一般语法是否与the documentation每个too large匹配应该非常容易。并且更难以验证复合格式字符串中占位符的索引是否小于实际的类型化参数数量(即它们不引用将不会给出的参数)。但是,如果已知传入参数的类型,则还应该可以验证“{index[,alignment][:formatString]}”是否适合这些类型。

例如,当第一个参数类型(0索引)是一个数字(:formatString产生“{{1}时,您希望验证用户未指定”{0:dddd MMMM}“作为格式字符串}}“)。按类型“String.Format("{0:dddd MMMM}", 1234)”选项的数量为IFormatProvider,以便手动检查所有内容。还有其他方法吗?或者您是否只需要与可能指定错误格式字符串的用户一起生活?

假设此处没有自定义ICustomFormatterIFormattable或{{3}}实施方案。只是.NET Framework中已有的基本类型。用于解决自定义内容的奖励点。

3 个答案:

答案 0 :(得分:5)

没有内置的方法,AFAIK。

您可以手动编码每个常见案例,但我不建议。

编辑)一个实用的选项可能是try/catch - 在用户输入格式时尽早测试格式....

答案 1 :(得分:4)

很抱歉,但这样做的方法是:

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

是的,有点不好。

答案 2 :(得分:1)

如果用户指定的格式错误字符串可能导致异常,那么您可以尝试一下吗?是的,这是天真而琐碎的想法。