2015-11-20 2 views
-1

Возможно ли иметь переменную со строковым форматом, который вы хотели бы интерполировать.Строковая интерполяция внутри интерполяции строк

public class Setting 
{ 
    public string Format { get; set; } 
} 


var setting = new Setting { Format = "The car is {colour}" }; 
var colour = "black"; 
var output = $"{setting.Format}"; 

Ожидаемый результат

"Автомобиль черный".

+0

Используйте 'string.Format'. если у вас есть переменные, а не константы. и вы не можете получить свой торт и съесть его тоже. –

+1

Люди написали кучу методов расширения для этой цели. ['FormatWith'] (http://james.newtonking.com/archive/2008/03/29/formatwith-2-0-string-formatting-with-named-variables) или аналогичный. Будьте предупреждены, что каждая из этих пользовательских функций имеет [несколько другое поведение] (https://web.archive.org/web/20131203044747/http://blog.dotnetwiki.org/2009/01/16/NamedFormatsPexTestimonium.aspx) , См. Также [Именованные форматы Redux] (http://haacked.com/archive/2009/01/14/named-formats-redux.aspx/). – Brian

ответ

8

Вы не можете этого сделать. Строковая интерполяция является чисто компиляционной функцией.

1

Вы можете сделать небольшое изменение на ней, как следующее:

public class Setting 
{ 
    public string Format 
    { 
     get 
     { 
      return String.Format(this.Format, this.Colour); 
     } 
     set 
     { 
      Format = value; 
     } 
    } 

    public string Colour { get; set; } 
} 


var setting = new Setting { Format = "The car is {0}", Colour = "black" }; 

Тогда на выходе будет «Автомобиль черного цвета».

Я не тестировал этот код. не

3

Нет, вы не можете сделать это, но вы можете достичь того же с несколько иным подходом, который я полюбил:

public class Setting 
{ 
    public Func<string, string> Format { get; set; } 
} 

, то вы можете передать строковый аргумент к Format:

var setting = new Setting { Format = s => $"The car is {s}" }; 
var output = setting.Format("black"); 
+0

Какой компилятор в основном превращается в 'Setting {Format = s => string.Format (« Автомобиль {0} ", s)};' –

3

Почему нет?
Прежде всего, вы не можете использовать локальную переменную, прежде чем объявлять ее на C#. Итак, Прежде чем использовать его, сначала объявите colour. Затем «интерполировать» строку, назначенную Format, и все готово.

var colour = "black"; 
var setting = new Setting { Format = $"The car is {colour}" }; 
var output = $"{setting.Format}"; 
Console.WriteLine(output); 

Выход:

Автомобиль черного цвета.

+0

Мне это нравится, но вы можете уточнить для будущих читателей, так как ваше изменение так тонкий? –

Смежные вопросы