给出以下方法:(实际方法有一些参数,但重要的参数是......)
public string DoSomething(string formatter, params string[] values)
{
// Do something eventually involving a call to String.Format(formatter, values);
}
有没有办法判断我的values数组中是否有足够的对象来覆盖格式化程序,所以如果没有,我可以抛出异常(没有做string.Format;这不是一个选项直到最后由于一些lambda转换)?
答案 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,然后将它们与值数组的长度进行比较。