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

时间:2010-06-16 20:51:38

标签: c# testing formatting params-keyword

给出以下方法:(实际方法有一些参数,但重要的参数是......)

public string DoSomething(string formatter, params string[] values)
{
    // Do something eventually involving a call to String.Format(formatter, values);
}

有没有办法判断我的values数组中是否有足够的对象来覆盖格式化程序,所以如果没有,我可以抛出异常(没有做string.Format;这不是一个选项直到最后由于一些lambda转换)?

4 个答案:

答案 0 :(得分:4)

我仍然不清楚为什么你认为你不能用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}string.Format无效,您还必须确定每个有效数字({0}, {1}, {5})至少有多少参数。此外,}{也会导致string.Format失败。

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

答案 1 :(得分:2)

我认为你对此过于担心。如果格式字符串无效,请让string.Format为您抛出异常。如果你不想抛出FormatException,请抓住它并抛出你想要的异常。

你已经做过一些处理(例如评估lambda转换)也不应该是一个问题,因为这毕竟是一个异常情况(可能除了lambda是非常昂贵,在这种情况下,首先执行string.Format测试而不处理参数以检查它是否有效,然后在需要稍后处理时重复它。)

答案 2 :(得分:0)

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

string.Format("{0}{0}", 123)

有效。

你真的需要提供更多信息才能回答这个问题...

答案 3 :(得分:0)

您可以为大括号格式化程序执行RegEx,然后将它们与值数组的长度进行比较。