Использование массива в String.Format

В настоящее время я работаю над приложением, зависящим от веб-API. Я создал класс со множеством строк API, таких как: /api/lol/static-data/{region}/v1/champion/{id}, Также я сделал метод:

public static String request(String type, Object[] param)
{
    return "";
}

Это будет делать запрашивающий материал. Поскольку с каждым типом запроса сильно зависит количество используемых параметров, для этого я использую массив. Теперь вопрос в том, возможно ли String.Format использовать массив для параметров, а ключи в строках не являются числами? Или кто-нибудь знает, как это сделать по-другому?

1 ответ

Решение

Нет, string.Format поддерживает только спецификации параметров на основе индекса.

Это:

"/api/lol/static-data/{region}/v1/champion/{id}"
                      ^^^^^^^^             ^^^^

придется обрабатывать другим методом, например, string.Replace или Regex,

Вам нужно будет:

  • Определите подходящий метод для замены
  • Решите, как массив с индексными значениями должен отображаться на параметры, они позиционные? то есть. {region} это первый элемент массива, {id} второй и т. д.?

Вот простая программа LINQPad, которая демонстрирует, как я бы это сделал (хотя я бы добавил немного больше обработки ошибок, возможно, кеширование информации об отражении, если она выполняется много, некоторые юнит-тесты и т. Д.):

void Main()
{
    string input = "/api/lol/static-data/{region}/v1/champion/{id}";
    string output = ReplaceArguments(input, new
    {
        region = "Europe",
        id = 42
    });
    output.Dump();
}

public static string ReplaceArguments(string input, object arguments)
{
    if (arguments == null || input == null)
        return input;

    var argumentsType = arguments.GetType();
    var re = new Regex(@"\{(?<name>[^}]+)\}");
    return re.Replace(input, match =>
    {
        var pi = argumentsType.GetProperty(match.Groups["name"].Value);
        if (pi == null)
            return match.Value;

        return (pi.GetValue(arguments) ?? string.Empty).ToString();
    });
}
Другие вопросы по тегам