返回字符串的函数结果的字符串插值

时间:2016-09-15 08:48:04

标签: c# string-interpolation

我有一个函数可以从xml文件中获取一些文本:

with open('t.txt', 'r') as f:
    res = []
    for line in f:
        if line.strip() != '':  # The sample file also has empty lines
            res.append(json.loads(line))

现在在XML中我想放入这样的字符串插值常量:

var text = Translate("/foo/bar");

所以,我想对Translate函数的结果进行字符串插值,就像这样:

<foo>
  <bar>Hi, {firstName} {lastName}!</bar>
</foo>

但这似乎不起作用。 有没有办法解决这个问题,除了恢复为string.Format?

如果美元符号可以放在任何字符串前面,可以是一个很好的,不管是变量,字符串还是函数,都可以进行字符串插值。

值得一提的是,我无法控制Translate函数的代码,因为它位于第三方组件中。

3 个答案:

答案 0 :(得分:8)

不,你不能这样做。字符串插值在编译时执行。编译器检查插值的字符串文字,找到相关的格式字符串并将它们转换为{0}等。在执行时没有类似的执行此操作。

答案 1 :(得分:4)

你做不到。

字符串插值是部分编译器魔术,你不能将字符串插值注入正常字符串。由于您无法更改Translate方法,因此它仍然会返回一个字符串,因此您必须自己完成此操作。

由于所有繁重的工作(查找表达式,提取它们,重写实际字符串等)都是在编译时完成的,因此没有可以帮助您完成此操作的运行时类。

现在,如果 all ,你所拥有的是事物的名称,而不是返回的字符串中的表达式,那么你可以自己做。换句话说,您展示的确切示例不应该难。但是,它仍然不是“字符串插值”,这将是你自己的事情。换句话说,如果返回的字符串曾经包含".... {firstname:-40} ..."之类的东西,那么你就会遇到困难。

最简单的天真的解决方案是进行简单的字符串替换:

var formattedText = $Translate("/foo/bar")
    .Replace("{firstname}", firstname)
    .Replace("{lastname}", lastname);

答案 2 :(得分:4)

如果您可以将变量转换为匿名(或定义的对象),则可以使用SmartFormat(https://github.com/scottrippey/SmartFormat.NET)。

var obj = new [MyClass - optional, if declared]
{
    FirstName = "John",
    LastName = "Smith",
}

var formattedText = Smart.Format(Translate("/foo/bar"), obj);

根据我的理解,您的代码无法正常工作的原因是在编译期间,而不是在运行时期间,内插字符串将被计算(其中包含变量)。