尽管 .NET 没有内置的能力来实现此功能,但您可以使用正则表达式轻松构建一个相当不错的实现:
public static string Format(string formatWithNames, IDictionary<string,object> data) {
int pos = 0;
var args = new List<object>();
var fmt = Regex.Replace(
formatWithNames
, @"(?<={)[^}]+(?=})"
, new MatchEvaluator(m => {
var res = (pos++).ToString();
var tok = m.Groups[0].Value.Split(':');
args.Add(data[tok[0]]);
return tok.Length == 2 ? res+":"+tok[1] : res;
})
);
return string.Format(fmt, args.ToArray());
}
这个想法是用连续的数字替换名称(参见
sb.Append(pos++)
),构建一个对象参数数组(参见
args.Add(data[tok[0]])
),并将结果传递给
string.Format
以使用
string
的格式化功能。
现在,您可以将资源和键值对字典一起传递给此
Format
,并使用.NET的内置格式化功能获取格式化字符串:
var x = new Dictionary<string,object> {
{"brown", 1}
, {"jumps", 21}
, {"lazy", 42}
};
Console.WriteLine("{0}", Format("Quick {brown} fox {jumps:C} over the {lazy:P} dog", x));
请注意字符串文字前面没有
$
,因此这里没有使用C#的内置插值。
这将打印:
Quick 1 fox $21.00 over the 4,200.00 % dog
该方法基于
Scott Hanselman提出的想法, 但格式不同。
演示。
string.Format
,但是却使用实际变量名作为占位符,而不是{0}
,{1}
等等?这是否可能? - elolos