English 中文(简体)
您如何在C#中针对其目标参数类型验证复合格式字符串?
原标题:
  • 时间:2009-04-01 20:14:08
  •  标签:

鉴于用户提供的复合格式字符串(用于String.Format)和表示用于格式化复合格式字符串的参数的一组类型,如何检查用户提供的值是否有效?

应该很容易创建一个正则表达式来检查参数占位符的一般语法是否匹配"{index[,alignment][:formatString]}",根据文档。在复合格式字符串中验证占位符的索引是否小于实际的类型化参数数量(即它们不引用不会被给出的参数)也不太困难。然而,考虑到将要传递的参数的类型已知,也应该可能验证":formatString"对于这些类型是合适的。

例如,您想要验证用户不会在第一个参数类型(0索引)为数字时指定“{0:dddd MMMM}”作为格式字符串(String.Format("{0:dddd MMMM}", 1234)返回“dddd MMMM”)。每种类型的“:formatString”选项的数量太大了,您无法手动检查所有内容。有其他方法吗?还是您只能忍受用户可能指定错误的格式字符串?

假设这里没有自定义的IFormatProviderICustomFormatterIFormattable实现。只有.NET框架中的基本类型。额外加分考虑自定义实现方案。

最佳回答

据我所知,没有内置的方法可以做到这一点。

你可以手动编写每个常见情况的代码,但是我不建议这样做。

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

问题回答

对不起,但是做法是:

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

是的,有点糟糕。

如果用户指定的格式字符串有误可能会导致异常,那么也许你可以试试看吗?是的,这是一个天真而琐碎的想法。





相关问题
热门标签