C# 如何判断格式化程序字符串中的替换数?

C# 如何判断格式化程序字符串中的替换数?,c#,testing,formatting,params-keyword,C#,Testing,Formatting,Params Keyword,给出以下方法:(实方法还有一些参数,但重要的参数如下…) 有没有办法告诉我的values数组中是否有足够的对象覆盖格式化程序,这样如果没有,我就可以抛出一个异常(除了执行string.Format;由于一些lambda转换,在结束之前这不是一个选项)使用正则表达式来计算模板的数量,但是要小心,因为 string.Format("{0}{0}", 123) 这是有效的 你真的需要提供更多信息来回答这个问题好的…你可以为大括号格式设置一个正则表达式,然后将它们与值数组的长度进行比较。我仍然不清楚你

给出以下方法:(实方法还有一些参数,但重要的参数如下…)


有没有办法告诉我的values数组中是否有足够的对象覆盖格式化程序,这样如果没有,我就可以抛出一个异常(除了执行string.Format;由于一些lambda转换,在结束之前这不是一个选项)

使用正则表达式来计算模板的数量,但是要小心,因为

string.Format("{0}{0}", 123)
这是有效的


你真的需要提供更多信息来回答这个问题好的…

你可以为大括号格式设置一个正则表达式,然后将它们与值数组的长度进行比较。

我仍然不清楚你为什么认为不能使用
string.Format
来测试它。如果传入的格式化程序应该具有值中项目的占位符,那么您应该能够执行以下操作:

static void TestFormat(string formatter, params string[] values)
{
    try
    {
        string.Format(formatter, values);
    }
    catch (FormatException e)
    {
        throw new Exception("the format is bad!!", e);
    }
}
示例用法:

        TestFormat("{0}{1}{2}", "a", "b", "c"); // works ok
        TestFormat("{0}{1}{2}", "a", "b"); // throws exception
        TestFormat("{0}{1}{2}}0{", "a", "b", "c"); // throws exception
尝试用正则表达式来实现这一点将是困难的,因为像这样的东西呢:

"{0}, {1}, {abc}, {1a4} {5} }{"
{abc}
{1a4}
字符串无效。Format
,您还必须确定每个有效数字(
{0},{1},{5}
)至少有那么多参数。另外,
}{
也会导致string.Format失败


我刚刚在最近的一个项目中使用了上面描述的前一种方法,效果非常好。

我认为您对此担心得太多了。如果格式字符串无效,让
string.format
为您抛出异常。如果您不想抛出
FormatException
,捕获它并抛出您想要的异常


您已经做了一些处理(例如评估lambda转换),这也不是什么问题,因为这毕竟是一种异常情况(可能有例外,lambda非常昂贵,在这种情况下,先测试
string.Format
而不处理参数以检查其有效性,然后在处理后需要时重复).

你可以解析格式化字符串,但你能详细说明为什么不能直接调用string.Format吗?因为在他知道自己有足够的参数之前,他不想做他的lambda工作…看看源代码。如果他们能计算出有多少令牌,你也应该这样做。很好,Esteban,Reflector告诉我string。Format最终可以wn是StringBuilder.AppendFormat()的重载之一,它们在其中执行检查(良好的ole方式检查“{”和“}”标记)。而{{}}表示替换为单大括号。我认为正则表达式不是一个非常健壮的解决方案。例如,想象一下格式化字符串中所有可能的占位符,如
{0:yyyy-MM-dd}
或转义大括号
{{{0}{1}}
这会使正则表达式哭泣并失败。这如何回答这个问题?我可以想到几个原因,为什么您需要知道需要填充多少令牌。您可能希望根据可用令牌的数量使用不同的值填充它们。想想asp.net mvc webform视图引擎使用字符串查找视图的方式。这就是一个有效的用法,不是吗?我想我可以使用string.Format来测试初始值,即使输入类型不是我最终用来格式化字符串的类型。在这两种情况下项目的数量都会匹配。对于这个写得不好的问题,我深表歉意。@Estaban Araya-请参阅操作:“有没有办法告诉我的值数组中是否有足够的对象覆盖格式化程序“。这就是上面的解决方案所做的,我提供了一些例子来证明它。我不知道您在这里还期望什么。显然,它解决了OP的问题,因为他们接受了它。OP接受了您的问题这一事实对您的答案的正确性及其质量没有影响。string.Format(“{0}-{1}”)不会引发异常,也不会告诉您有关要填充的令牌数的任何信息。@Esteban Araya-您错了。string.Format(“{0}-{1}”)确实会引发异常。在发布之前你没有自己测试过吗?没错,这是一个异常情况。如果是我为自己编写的代码,我可能会使用这种方法,因为……我知道它是如何工作的,因为我编写了它。另外一个输入是列表,我在编写此方法时考虑到了其他开发人员,所以作为一个在这种情况下,由于不知道如何使用该方法,因此能够快速返回将是我的理想解决方案。
"{0}, {1}, {abc}, {1a4} {5} }{"