如何将C#插值字符串自动重构为string.Format(…)?

如何将C#插值字符串自动重构为string.Format(…)?,c#,string,C#,String,最近在C#6中引入了一个新的语言元素/语法糖,名为字符串插值 然而,在享受了这种语法的甜味几分钟之后,很快就发现,插值字符串(从语义角度来看仍然是字符串文字)无法重构为资源,因为嵌入的变量仅存在于定义插值字符串的范围内 例如,这个作用域锁定的字符串文本无法本地化,并且不管本地化需要如何,一些代码质量检查器通常将嵌入的字符串文本视为代码气味 在使用庞大的企业代码库时,我预计会出现越来越多的插值字符串,因此问题将很快从理论转向实际。两样我都想要 有一条代码质量检查规则,禁止这种做法 就像代码中间的

最近在C#6中引入了一个新的语言元素/语法糖,名为字符串插值

然而,在享受了这种语法的甜味几分钟之后,很快就发现,插值字符串(从语义角度来看仍然是字符串文字)无法重构为资源,因为嵌入的变量仅存在于定义插值字符串的范围内

例如,这个作用域锁定的字符串文本无法本地化,并且不管本地化需要如何,一些代码质量检查器通常将嵌入的字符串文本视为代码气味

在使用庞大的企业代码库时,我预计会出现越来越多的插值字符串,因此问题将很快从理论转向实际。两样我都想要

  • 有一条代码质量检查规则,禁止这种做法 就像代码中间的字符串文字(我可以通过它来管理) 在标准质量工具中定义自定义规则。虽然StyleCop目前甚至无法识别这些规则,并且会出现内部错误,因此这并不像听起来那么容易)
  • 有一个重构工具可以重构什么 字符串插值到string.Format,以便 重构为标准的.NET资源

任何启用代码分析的建议都会阻止使用插入字符串(警告),因为它们不支持指定区域设置(与
String.Format
不同)。因此,虽然这有点尴尬,但对于您的特殊情况,这是可能的解决方案


此外,R#可以快速地将一种格式转换为另一种格式,因此,虽然代码分析和R#不能自动组合,但它可以让您快速找到并部分更正所有情况。

使用字符串插值可以实现本地化

考虑这一点:

System.FormattableString s = $"Hello, {name}";
s、 ToString()将使用当前区域性生成字符串

float flt = 3.141;

System.IFormattable s = $"{flt}";
使用IFormattable,您可以根据特定语言更改数字格式

所以它是可能的,只是不是直接的

资料来源:


ReSharper可能允许您在格式之间进行更改。通常,如果它可以从A转换到B,它可以让你从B转换到A。或者只写一个新的Roslyn分析仪@编写自定义代码转换Roslyn似乎是一项有点难以完成的任务,而且我不想重新发明轮子。无论如何,你说的“自动”是什么意思?您想编写一个程序,将插值字符串转换为String.Format()?@sweeper我是说一个重构工具。理想情况下,这可以检查构建服务器中的代码库,但不太理想的情况是,只需单击几下,就可以重构整个项目/解决方案。哦,没关系。。。我明白你的意思。您希望整个字符串都可以本地化。。。应该是
String.Format(“我的名字是{0}”,myName)
应该是
String.Format(project.resources.Introduction,myName)
。本地化不仅仅是为了获得正确的小数分隔符和其他特定于区域性的设置。它还将使用资源获取特定于语言的字符串版本。我的陈述是:“不能重构为资源,因为嵌入的变量只存在于定义插值字符串的范围内。”,这是正确的。使用插值字符串是很好的,但是代码的味道。