我正在编写一个 C# 应用程序。我将其目标定为 .NET 4.5.1。
我的应用程序中有一个翻译服务,翻译后的字符串存储在数据库中。字符串可以包含任意数量、任意类型的参数。
string formatString = GetFormatStringFromDB();
Dictionary<string,object> parameters = GetNamedParametersFromSomewhere();
var result = Format(formatString, parameters);
复合格式语法看起来是一个理想的候选者。
喜欢:
string formatString = "{0} is married to {1}, and they have a child of age {2}"; // note that this should still come from the DB
Dictionary<string,object> parameters = GetNamedParametersFromSomewhere();
var result = string.Format(formatString, parameters.Select(o => o.Value)); // I might need to convert this to an array.
我想要命名参数。我不想用数字索引来标识参数:它不是描述性的,我很可能会在翻译中混淆/混合它们。
我可以用参数名称来表示参数的语法,例如:
string formatString = "{wife} is married to {husband}, and they have a child of age {childAge}";
嘿,这看起来类似于 C# vNext 中新的 String Interpolation 语法!我可以使用它吗?
否:
FormattedString
类对我来说似乎太令人困惑了,但这可能是一个解决方案,尽管我需要将其移植回当前的 .NET,并且我需要一些帮助(以及正确使用它)。 还可以使用复合格式来格式化日期时间或整数,例如:
"birthday: {0:d}"
。它对于翻译非常有用,因为不同的语言和文化往往以完全不同的格式表示这些内容。我不想失去这个功能。
我可以使用的语法。一些函数将参数提供给字符串并获取结果。
喜欢:
string formatString = GetFormatStringFromDB();
// "Age: {age}, Birthday: {birthday:d}"
Dictionary<string,object> parameters = GetNamedParametersFromSomewhere();
// { "age": (int)10, "birthday": (DateTime)1988-01-01 }
var result = myOwnFormat(formatString, parameters);
//result should be "Age: 10, Birthday: 12/30/2011"
我应该推出自己的语法和解析器吗?有类似的东西已经实现了吗?
编辑:
我重新表述了整个问题,更好地描述了问题(希望如此),指出了我的要求。
即使最新的.net core版本,也不支持运行时插值。但是,此代码适用于 .net core 和 .net Framework。
我也针对同样的场景推出了自己的方案。我从另一个堆栈溢出帖子中找到了这个想法。忘记在哪里了,否则我会相信他们。当前有一个问题我需要解决,它不允许文字大括号“{”。
源代码:https://gist.github.com/tcartwright/cca1247a741eaf9f191003fe3d599edd
使用示例:
public class Customer {
public string Name { get; set; } = null!;
public int Id { get; set; }
}
// concrete poco
var customer = new Customer { Name = "Microsoft", Id = 1234 };
var str = "Customer: {customer.Name}, id: {customer.Id}"
.ToFormattedString(new NamedParameter("customer", customer));
Console.WriteLine(str);
// using with a dynamic
dynamic customer2 = new { Name = "Stack Overflow", Id = 8675309 };
str = "Customer: {customer.Name}, id: {customer.Id}"
.ToFormattedString(new NamedParameter("customer", customer2));
Console.WriteLine(str);