对返回String的函数的结果进行字符串插值

本文关键字:字符串 插值 函数 返回 String 结果 | 更新日期: 2023-09-27 18:07:02

我有一个函数,从xml文件中获取一些文本,像这样:

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

现在在XML中,我要像这样放入字符串插值常量:

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

那么,我想对translate函数的结果进行字符串插值,就像这样:

var firstName = "John";
var lastName = "Smith";
var formattedText = $Translate("/foo/bar");

但这似乎不起作用。除了返回到字符串,还有别的方法吗?格式吗?

如果美元符号可以放在任何字符串前面,无论是变量,字符串还是函数,都可以进行字符串插值,那就太好了。

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

对返回String的函数的结果进行字符串插值

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

你不能那样做。

字符串插值部分是编译器的魔法,你不能把字符串插值注入到一个正常的字符串中。因为你不能改变Translate方法,它仍然会返回一个字符串,因此你必须自己做这件事。

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


现在,如果所有的都是事物的名称,而返回的字符串中没有表达式,那么您可以自己做。换句话说,您所展示的确切示例不应该太难。然而,它仍然不是"字符串插值",这将是你自己的事情。换句话说,如果返回的字符串曾经包含像".... {firstname:-40} ..."这样的内容,那么您将面临艰难的旅程。

最简单的朴素的解决方案是做简单的字符串替换:

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

如果你可以将变量转换为匿名(或定义对象),你可以使用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);

你的代码不工作的原因,据我所知,是插值字符串被评估(其中的变量),在编译期间,而不是在运行时。