Строка Интерполяция с переменной формата

Я могу это сделать:

var log = string.Format("URL: {0}", url);

или даже как это

var format = "URL: {0}";
...
var log = string.Format(format, url);

У меня есть format, определенный где-то в другом месте, и используйте переменную format, а не встроенную строку.

В С# 6 это кажется невозможным:

var format = $"URL: {url}"; // Error url does not exist
...
var url = "http://google.com";
...
var log = $format; // The way to evaluate string interpolation here

Можно ли использовать интерполяцию строк с объявленной ранее переменной?

С# 6, кажется, интерполирует строку inline во время компиляции. Однако рассмотрите возможность использования этой функции для локализации, определите формат в конфигурации или просто укажите формат const в классе.

Ответы

Ответ 1

Нет, вы не можете использовать интерполяцию строк с чем-то отличным от строкового литерала, поскольку компилятор создает строку "обычного" формата даже при использовании интерполяции строк.

Потому что это:

string name = "bar";
string result = $"{name}";

заключается в следующем:

string name = "bar";
string result = string.Format("{0}", name);

строка во время выполнения должна быть "обычной" строкой формата, а не эквивалентной для интерполяции строк.

Вместо этого вы можете использовать простой старый String.Format.

Ответ 2

Одним из подходов к работе над этим было бы использование лямбда, содержащей интерполированную строку. Что-то вроде:

Func<string, string> formatter = url => $"URL: {url}";
...
var googleUrl = "http://google.com";
...
var log = formatter(googleUrl);

В С# 7.0 вы можете использовать локальную функцию вместо лямбда, чтобы сделать код немного более простым и эффективным:

string formatter(string url) => $"URL: {url}";
...
var googleUrl = "http://google.com";
...
var log = formatter(googleUrl);

Ответ 3

Интерполяция строк - это компилятор, а не библиотека.

Отверстия - это не имена, а выражения:

var r = new Rectangle(5, 4);
var s = $"area: {r.Width + r.Heigh}":

Как вы это сделаете для локализации, как собираетесь?

Даже r существует только во время компиляции. В IL это просто позиция в стеке переменных метода.

Я сделал то, что вы намереваетесь сделать для ресурсов и файлов конфигурации.

Поскольку у вас может быть только конечный набор "переменных", чтобы заменить, то, что я сделал, был массив (или словарь, если вы предпочитаете), и используйте регулярное выражение для замены имен в отверстиях индексом. То, что я даже допустил для спецификаторов формата.

Ответ 4

Кажется, что вы можете сделать это следующим образом:

var googleUrl = "http://google.com";
var url = $"URL: {googleUrl}";

System.Console.WriteLine(url);

Вы можете проверить более подробную информацию в https://msdn.microsoft.com/en-us/library/dn961160.aspx