带有命名参数的参数化字符串语法

问题描述 投票:0回答:1

我正在编写一个 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 语法!我可以使用它吗?

否:

  1. 这是 vNext 功能,我需要 .NET 4.5.1 的解决方案。
  2. 这甚至不是我需要的。它仅适用于内联字符串,其中参数(已经可用)会自动替换。它无法被存储,并在以后针对不同的参数集进行评估。使用新的
    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"

我应该推出自己的语法和解析器吗?有类似的东西已经实现了吗?

编辑:

我重新表述了整个问题,更好地描述了问题(希望如此),指出了我的要求。

c# named-parameters
1个回答
0
投票

即使最新的.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);
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.