2015-11-20 109 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

編譯器基本上變成了'設置{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

我喜歡這個,但是你可以爲未來的讀者詳細說明,因爲你的改變是如此微妙? –