字符串插值内嵌字符串插值

3

是否可以拥有一个带有字符串格式的变量,你想要进行插值。

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


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

期望输出

“这辆车是黑色的”。


使用 string.Format,如果你有变量而不是常量。但你不能两全其美。 - M.kazem Akhgary
1
人们已经为此编写了大量的扩展方法。FormatWith或类似的方法。请注意,这些自定义函数中的每一个都有略微不同的行为。另请参见命名格式Redux - Brian
4个回答

10

你不能这样做。字符串插值是一种纯粹的编译时特性。


5

不,你不能这样做,但是你可以用略微不同的方法实现相同的效果,我喜欢这种方法:

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");

编译器基本上会将其转换为 Setting { Format = s => string.Format("这辆车是{0}", s) }; - Ron Beyer

3

为什么不呢?
首先,在C#中,你不能在声明之前使用局部变量。所以,先声明colour,然后“插值”分配给Format的字符串,就完成了。

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

输出:

汽车是黑色的。


我喜欢这个,但是你能详细解释一下吗?因为你的更改非常微小,以便未来的读者能够理解。 - rory.ap

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" };

然后输出将是"The car is black"。 我还没有测试过这段代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接