我有一个函数可以从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函数的代码,因为它位于第三方组件中。
答案 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);
根据我的理解,您的代码无法正常工作的原因是在编译期间,而不是在运行时期间,内插字符串将被计算(其中包含变量)。