如何根据目标参数类型验证C#中的复合格式字符串?

如何根据目标参数类型验证C#中的复合格式字符串?,c#,validation,string.format,C#,Validation,String.format,给定用户提供的复合格式字符串(用于string.format)和一组表示用于格式化复合格式字符串的参数的类型,如何检查用户提供的值是否有效 创建正则表达式以检查参数占位符的常规语法是否与“{index[,alignment][:formatString]}”匹配应该非常容易。验证复合格式字符串中占位符的索引是否小于类型化参数的实际数量(即,它们不引用不会给出的参数)也不太困难。但是,如果已知将传入的参数的类型,则还可以验证“:formatString”是否适合这些类型 例如,当第一个参数类型(0

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

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

例如,当第一个参数类型(0索引)是一个数字(
string.format(“{0:dddddd MMMM}”,1234)
产生“
dddd MMMM
”)时,您希望验证用户没有将“
{0:dddddddd MMMM}
”指定为格式字符串。按类型划分的“
:formatString
”选项的数量是要手动检查所有内容。还有别的办法吗?或者,您是否必须与可能指定错误格式字符串的用户共存


假设这里没有自定义或实现。只是.NET Framework中已有的基本类型。解决定制问题的额外积分。

没有内置的方法,阿飞

您可以手动编写每个常见情况的代码,但我不推荐这样做


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

对不起,但方法是:

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

是的,有点糟糕。

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

这正是我想要避免的。我甚至不想为占位符使用正则表达式!在需要验证格式时,我有类型,而不是类型的实例,因此没有“aBunchOfArguments”可提供。。。Activator.CreateInstance-pYeah,如果要使用此方法,则必须使用反射创建实例。Activator.CreateInstance(typeof(string))失败(缺少无参数构造函数),因此创建实例不仅仅是反射。此外,FormatException似乎只有在索引不正确并且没有实际验证“:formatString”是否适合该类型时才会抛出。这并不是说我将执行Activator.CreateInstance(typeof(string))--它更像是:foreach(types中的类型t){Activator.CreateInstance(t)}(以及其他一些东西)。创建过程将最少需要使用特殊大小写字符串(使用string.Empty)。其他类型也可能有问题(没有尝试过)。