Интерполированные строки, хранящиеся в переменной [duplicate]

Попробуйте это -

$(document).on( 'click', '.click-activity', function () { ... });
4
задан Selman Genç 8 April 2017 в 00:23
поделиться

3 ответа

Это можно сделать по запросу с использованием динамической компиляции, например, через пакет Microsoft.CodeAnalysis.CSharp.Scripting . Например:

var name = "Joe";
var template = "Hi {name}";
var result = await CSharpScript.EvaluateAsync<string>(
    "var name = \"" + name + "\"; " +
    "return $\"" + template + "\";");

Обратите внимание, что этот подход медленный, и вам нужно будет добавить больше логики для обработки экранирования кавычек (и инъекционных атак) в строках, но выше это служит доказательством того, из-концепции.

2
ответ дан Douglas 17 August 2018 в 18:58
поделиться
  • 1
    супер хак, но законно, и мне это нравится;) – Brady Moritz 13 July 2018 в 22:05

Нет, вы не можете этого сделать, поскольку для создания строки времени (времени компиляции) требуется значение name. Вместо этого используйте String.Format или String.Replace.

1
ответ дан Hung Cao 17 August 2018 в 18:58
поделиться

Я думаю, что эти строки всегда будут иметь одинаковое количество параметров, даже если они могут измениться. Например, сегодня template является "Hi {name}", а завтра может быть "Hello {name}".

Короткий ответ: Нет, вы не можете делать то, что вы предложили.

Альтернатива 1: используйте метод string.Format .

Вы можете сохранить в своей базе данных что-то вроде этого:

"Hi {0}"

Затем, когда вы извлекаете шаблон строки из db, вы можете написать:

var template = "Hi {0}"; //retrieved from db
var name = "Joe";
var result = string.Format(template, name);
//now result is "Hi Joe"

С двумя параметрами:

var name2a = "Mike";
var name2b = "John";
var template2 = "Hi {0} and {1}!"; //retrieved from db
var result2 = string.Format(template2, name2a, name2b);
//now result2 is "Hi Mike and John!"

Альтернатива 2: используйте заполнитель.

Вы можете сохранить в своем что-то вроде этого:

"Hi {name}"

Затем, когда вы извлекаете шаблон строки из db, вы можете написать:

var template = "Hi {name}"; //retrieved from db
var name = "Joe";
var result = template.Replace("{name}", name);
//now result is "Hi Joe"

С тремя параметрами:

var name2a = "Mike";
var name2b = "John";
var template2 = "Hi {name2a} and {name2b}!"; //retrieved from db
var result2 = template2
    .Replace("{name2a}", name2a)
    .Replace("{name2b}", name2b);
//now result2 is "Hi Mike and John!"

Обратите внимание, на какой маркер вы выбираете для своих заполнителей. Здесь я использовал окружающие фигурные скобки {}. Вы должны найти что-то, что вряд ли вызовет столкновения с остальной частью вашего текста. И это полностью зависит от вашего контекста.

3
ответ дан Massimiliano Kraus 17 August 2018 в 18:58
поделиться
  • 1
    Спасибо за ответ. Я использовал string.Format в течение многих лет, а интерполяция строк сделала код более читаемым. Я надеялся, что это будет работать с переменной шаблона как string.Format становится очень уродливым и подверженным ошибкам, когда вы получаете более 20 переменных. Я, скорее всего, займусь строкой. Замените для каждой переменной и замените сами заполнители шаблонов. – Tony Lugg 13 April 2017 в 19:34
  • 2
    @TonyLugg, в чем преимущество использования string.Replace, а не string.Format? Как бы вы его использовали, мне это интересно. – Massimiliano Kraus 13 April 2017 в 19:41
  • 3
    Извините за задержку с ответом. У меня есть много переменных, которые нужно заменить в очень большом документе. Использование string.Format было бы очень трудно читать и подвергать ошибкам (порядок должен соответствовать экземплярам {#} в исходной строке. Заменить самодокументы, какая переменная заменяется на заменяющую строку. – Tony Lugg 3 June 2017 в 23:15
  • 4
    @TonyLugg Я отредактировал свой ответ, добавив предлагаемое вами решение. Считаете ли вы, что теперь мой ответ можно считать окончательным? В эти месяцы не было других решений. – Massimiliano Kraus 22 September 2017 в 21:01
  • 5
    @TonyLugg, я просто говорю ... StackOverflow предназначен для правильных ответов на размещенные вопросы. Для других пользователей полезно узнать, какой из них является правильным ответом. Таким образом, у вас есть 2 возможности: или вы проверяете мой ответ как правильный, или отправляете ответ только с помощью своего решения и проверяете его как правильное. Если оставить этот вопрос без ответа вообще, это не хорошо, по крайней мере, о том, как SO должен работать. И на самом деле есть ответ. – Massimiliano Kraus 24 September 2017 в 12:51
Другие вопросы по тегам:

Похожие вопросы: