将资源字符串格式化为另一个?

时间:2011-12-30 15:22:12

标签: c# resources

完成这样的事情最好的方法是什么?

假设我有以下Resource个字符串对。

BadRequestParameter:            Potential bad request aborted before execution.
RequiredParameterConstraint:    {0} parameter requires a value. {1}

假设我想在第二个{1}上设置BadRequestParameter的值string.Format。我可以使用Resource轻松完成。但现在假设我有很多Resource个字符串,就像第二个字符串一样,所有字符串中都包含一些其他string.Format字符串。
 编码的最佳方法是什么?在每种情况下都使用BadRequestParameter Potential bad request aborted before execution. EmptyVector Vectorized requests require at least one element. {0} OverflownVector Vectorized requests can take at most one hundred elements. {0} RequiredParamConstraint {0} parameter requires a value. {1} SortMinMaxConstraint {0} parameter value '{1}' does not allow Min or Max parameters in this query. {2} SortRangeTypeConstraint Expected {0} parameter Type '{1}'. Actual: '{2}'. {3} SortValueConstraint {0} parameter does not allow '{1}' as a value in this query. {2} 重复我真的能做什么吗?

更新

我会试着更好地解释自己。这些是我实际拥有的资源字符串:

BadRequestParameter

我想避免在每一行的末尾用{x}写字符串。因此,我在这些字符串的末尾添加了一种格式。现在的问题是,我想以某种方式自动引用BadRequestParameterstring.Format(Error.EmptyVector, Error.BadRequestParameter); ,以避免像

那样进行调用
{{1}}

3 个答案:

答案 0 :(得分:1)

  

我有许多资源字符串,如第二个,所有资源字符串都包含其中的一些其他资源字符串。

您可以存储用于构建实际格式字符串的原始材料,并添加代码以在使用前以编程方式扩展它们,而不是存储准备好使用的预制格式字符串。例如,您可以存储如下字符串:

BadRequestParameter:            Potential bad request aborted before execution.
SupportNumber:                  (123)456-7890
CallTechSupport:                You need to call technical support at {SupportNumber}.
RequiredParameterConstraint:    {{0}} parameter requires a value. {BadRequestParameter} {CallTechSupport}

当然,将这些字符串传递给string.Format并不会起作用。您需要解析这些字符串,例如使用RegExp s,并查找所有在花括号之间有单词的实例,而不是数字。然后,您可以用序列号替换每个单词,并根据花括号之间的名称生成一个参数数组。在这种情况下,您将获得这两个值(伪代码):

formatString = "{{0}} parameter requires a value. {0} {1}";
// You replaced {BadRequestParameter} with {0} and {CallTechSupport} with {1}
parameters = {
    "Potential bad request aborted before execution."
,   "You need to call technical support at (123)456-7890."
};

注意:当然,生成这个parameters数组需要递归。

此时,您可以调用string.Format来生成最终字符串:

var res = string.Format(formatString, parameters);

这将返回具有为调用者预先替换的资源字符串的字符串:

"{0} parameter requires a value. Potential bad request aborted before execution. You need to call technical support at (123)456-7890."

调用者现在可以使用此字符串进行格式化,而无需使用其他资源值。

答案 1 :(得分:0)

是的:-)除非你想制作一个更短的辅助方法,但这只是为了方便起见

public static string f(string format, params object[] p)
{
    return string.Format(format, p);
}

答案 2 :(得分:0)

如果您将参数指标{#}视为通配符,那么为什么在您的资源中预先填充它们是有意义的。

我认为

绝对没有错
String.Format(RequiredParamterConstraint, "something", BadRequestParameter);