如何在两个string.Format调用之后保留“{0}”

时间:2012-03-28 12:20:41

标签: c# .net

  

可能重复:
  how to add { in String Format c#

当我重写总是相同的东西时,我习惯于写出我称之为字符串模式的东西。

假设我想进行SQL注入以扩展ORM功能......

protected static string FULLTEXTPATTERN = "EXISTS CONTAINSTABLE([{0}],*,'\"{1}\"') WHERE [key] = {0}.id;

通常我得到了表格名称和值,我将其组合在一个string.format(FULLTEXTPATTERN,...)中,一切都很好。

现在想象一下,我必须两次这样做。首先注入表名,然后是我搜索的值。所以我想写一些类似的东西:

protected static string FULLTEXTPATTERN = "EXISTS CONTAINSTABLE([{0}],*,'\"{{0}}/*Something that returns {0} after string.format*/\"') WHERE [key] = {0}.id;
...
var PartialPattern= string.fomat(FULLTEXTPATTERN, "TableX");
//PartialPattern = "EXISTS CONTAINSTABLE([TableX],*,'\"{0}\"') WHERE [key] = {0}.id"
...
//later in the code
...
var sqlStatement = string.format(PartialPattern,"Pitming");
//sqlStatement = "EXISTS CONTAINSTABLE([TableX],*,'\"Pitming\"') WHERE [key] = {0}.id"

有办法吗?

2 个答案:

答案 0 :(得分:1)

逻辑说你只需将{{{0}}}放在格式字符串中,以便在第二次{0}调用后将其缩小到string.Format,但你不能 - 抛出一个{ {1}}。但那是因为你还需要另一个FormatException{,否则它的格式不正确:)。

您可以做什么 - 将完整格式设置为此(请注意最后的4个}{个字符):

}

然后您的最终字符串将包含您期望的"EXISTS CONTAINSTABLE([{0}],*,'\"{{0}}\"') WHERE [key] = {{{{0}}}}.id";

作为证明 - 运行此测试:

{0}

答案 1 :(得分:0)

是否可以将生成SQL的时间延迟到您拥有所有必需输入的位置,以便您可以使用一次调用String.Format()和多个字段?

或者,您可以使用StringBuilder而不是String.Format()迭代地构建查询。