Использование массива в 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();
});
}