我需要在程序中创建一个非常长的字符串,并且一直在使用String.Format。我面临的问题是当你有超过8-10个参数时,跟踪所有的数字。
有没有可能创建某种形式的重载来接受类似如下的语法?
String.Format("You are {age} years old and your last name is {name} ",
{age = "18", name = "Foo"});
发布于 2009-08-24 12:33:23
下面的代码如何,它既适用于匿名类型(下面的示例),也适用于常规类型(域实体等):
static void Main()
{
string s = Format("You are {age} years old and your last name is {name} ",
new {age = 18, name = "Foo"});
}
使用:
static readonly Regex rePattern = new Regex(
@"(\{+)([^\}]+)(\}+)", RegexOptions.Compiled);
static string Format(string pattern, object template)
{
if (template == null) throw new ArgumentNullException();
Type type = template.GetType();
var cache = new Dictionary<string, string>();
return rePattern.Replace(pattern, match =>
{
int lCount = match.Groups[1].Value.Length,
rCount = match.Groups[3].Value.Length;
if ((lCount % 2) != (rCount % 2)) throw new InvalidOperationException("Unbalanced braces");
string lBrace = lCount == 1 ? "" : new string('{', lCount / 2),
rBrace = rCount == 1 ? "" : new string('}', rCount / 2);
string key = match.Groups[2].Value, value;
if(lCount % 2 == 0) {
value = key;
} else {
if (!cache.TryGetValue(key, out value))
{
var prop = type.GetProperty(key);
if (prop == null)
{
throw new ArgumentException("Not found: " + key, "pattern");
}
value = Convert.ToString(prop.GetValue(template, null));
cache.Add(key, value);
}
}
return lBrace + value + rBrace;
});
}
发布于 2015-10-07 19:31:09
从C#6开始,现在可以使用新的string interpolation语法进行这种字符串插值:
var formatted = $"You are {age} years old and your last name is {name}";
发布于 2009-08-24 12:25:12
不是完全相同,但有点欺骗它。使用扩展方法、字典和一些代码:
就像这样..。
public static class Extensions {
public static string FormatX(this string format, params KeyValuePair<string, object> [] values) {
string res = format;
foreach (KeyValuePair<string, object> kvp in values) {
res = res.Replace(string.Format("{0}", kvp.Key), kvp.Value.ToString());
}
return res;
}
}
https://stackoverflow.com/questions/1322037
复制相似问题