шаблон строки формата с именованными параметрами в литерал c # - PullRequest
0 голосов
/ 06 марта 2019

У меня есть приложение, которое создает строковые шаблоны с именованными переменными. Это делается в соответствии с руководством по ведению журнала для 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}' или именованный параметр, и заменить именованное индексами перед форматированием. Но я хотел знать, есть ли более простые / чистые способы сделать это.

Обновление - решение для регулярных выражений:

Bellow - это текущее решение, которое я сделал с помощью регулярных выражений

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);
            }
        }
    }
...