使用命名参数将字符串模板格式化为文字C#

时间:2019-03-06 12:34:48

标签: c# asp.net-core string.format stringtemplate

我有一个使用命名变量创建字符串模板的应用程序。这是根据ASP.NET Core

的日志记录指南完成的

现在我发现自己也想通过API本身传递这些字符串,但是这次填充了所有参数。

基本上我想使用:

var template = "ID {ID} not found";
var para = new object[] {"value"};
String.Format(template, para);

但是,这给出了无效的输入字符串。 当然,我也不能保证有人不会用索引的“经典”方式制作字符串模板。

var template2 = "ID {0} not found";

是否存在一种新的格式化字符串的方式,或者我们应该解决此问题?

我不想修改现有代码库以使用数字或使用$“ ... {para}”语法。因为这会在记录日志时丢失信息。

我猜我可以进行正则表达式搜索,看看是否有'{0}'或命名参数,并在格式化之前将其替换为索引。但是我想知道是否有一些更简单/更干净的方法。

更新-正则表达式解决方案:

下面是我使用正则表达式制作的当前解决方法

public static class StringUtils
    {
        public static string Format(string template, params object[] para)
        {
            var match = Regex.Match(template, @"\{@?\w+}");
            if (!match.Success) return template;

            if (int.TryParse(match.Value.Substring(1, match.Value.Length - 2), out int n))
                return string.Format(template, para);
            else
            {
                var list = new List<string>();
                var nextStartIndex = 0;
                var i = 0;
                while (match.Success)
                {
                    if (match.Index > nextStartIndex)
                        list.Add(template.Substring(nextStartIndex , match.Index - nextStartIndex) + $"{{{i}}}");
                    else
                        list.Add($"{{{i}}}");

                    nextStartIndex = match.Index + match.Value.Length;

                    match = match.NextMatch();
                    i++;
                }

                return string.Format(string.Join("",list.ToArray()), para);
            }
        }
    }

0 个答案:

没有答案