完成这样的事情最好的方法是什么?
假设我有以下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}
写字符串。因此,我在这些字符串的末尾添加了一种格式。现在的问题是,我想以某种方式自动引用BadRequestParameter
到string.Format(Error.EmptyVector, Error.BadRequestParameter);
,以避免像
{{1}}
答案 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);