C#6.0有一个string interpolation-一个很好的功能,可以格式化字符串,比如:

 var name = "John";
 WriteLine($"My name is {name}");

该示例将转换为

 var name = "John";
 WriteLine(String.Format("My name is {0}", name));

从本地化的Angular 来看,存储字符串要好得多,比如:

"My name is {name} {middlename} {surname}" 

而不是用绳子.格式符号:

"My name is {0} {1} {2}"

如何使用字符串插值.网络本地化?有没有办法把美元放进go 资源文件?或者字符串应该像"…{name}"那样存储,并以某种方式动态插入?

另外,这个问题不是关于"如何进行string.formatt扩展"(有很多这样的库,所以答案等等).这个问题是关于"本地化"上下文中"字符串插值"的Roslyn扩展(两者都是MS.NET词汇表中的术语),或者Dylan提出的动态用法.

推荐答案

使用Microsoft.CodeAnalysis.CSharp.Scripting包可以实现这一点.

您将需要创建一个对象来存储数据,下面使用的是动态对象.您还可以创建具有所有必需属性的特定类.在描述的here中将动态对象包装在类中的原因.

public class DynamicData
{
    public dynamic Data { get; } = new ExpandoObject();
}

然后,您可以使用它,如下所示.

var options = ScriptOptions.Default
    .AddReferences(
        typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).GetTypeInfo().Assembly,
        typeof(System.Runtime.CompilerServices.DynamicAttribute).GetTypeInfo().Assembly);

var globals = new DynamicData();
globals.Data.Name = "John";
globals.Data.MiddleName = "James";
globals.Data.Surname = "Jamison";

var text = "My name is {Data.Name} {Data.MiddleName} {Data.Surname}";
var result = await CSharpScript.EvaluateAsync<string>($"$\"{text}\"", options, globals);

这是编译代码片段并执行它,所以这是真正的C#string插值.尽管您必须考虑它的性能,因为它实际上是在运行时编译和执行代码.如果可以使用CSharpScript,就可以避开这一性能问题.创建以编译和缓存代码.

.net相关问答推荐

如何运行大量阻塞/同步 I/O 操作

部署时如何控制红隼端口?

如何在 .Net Core EF 中组合多个条件表达式来过滤数据?

无法实例化类的代理:System.Net.HttpWebRequest.找不到无参数构造函数

标签从右向左增长

如何在任务栏顶部全屏显示 Windows 窗体?

C# 时间跨度毫秒与 TotalMilliseconds

每第 N 个字符/数字拆分一个字符串/数字?

泛型方法是如何、何时、何地具体化的?

具有透明背景且包含不透明控件的 WPF 窗口

将跟踪输出重定向到控制台

什么是 SUT,它来自哪里?

ObservableCollection<> 与 List<>

将记录器作为单身人士是一个好习惯吗?

使用+运算符的字符串连接

String.Join 与 StringBuilder:哪个更快?

带有嵌套控件的设计模式

WPF 中的 Application.DoEvents() 在哪里?

可以从 C# 调用 C++ 代码吗?

判断类中是否存在属性