2

给定以下方法:(真正的方法有更多参数,但重要的参数如下......)

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

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

4

4 回答 4

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 失败。

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

于 2010-06-16T21:01:40.477 回答
2

我觉得你在这方面担心太多了。如果格式字符串无效,string.Format请为您抛出异常。如果您不想FormatException抛出 a ,请捕获它并抛出您想要的异常。

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

于 2010-06-16T21:17:52.373 回答
0

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

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

已验证。

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

于 2010-06-16T20:56:43.743 回答
0

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

于 2010-06-16T20:59:25.017 回答