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相关问答推荐

无法在Designer、VS2022、. NET 8中打开WinForms表单'

PowerShell中窗体定时器和系统定时器的统一处理

从删除项目时重新索引的列表中删除项目的最佳算法是什么?

双精度的 C++ 和 C# 十六进制值之间的差异

线程安全性的单元测试?

单击关闭按钮时隐藏表单而不是关闭

如何让 DateTimePicker 显示一个空字符串?

在 WPF 窗口中获取当前聚焦的元素/控件

我应该从 .NET 中的 Exception 或 ApplicationException 派生自定义异常吗?

为什么 Interlocked.Exchange 不支持布尔类型?

为什么 .NET 中不需要 Maven?

Visual Studio 2017 和 2019 突出显示滚动条中所选单词的出现

ReaderWriterLockSlim 什么时候比简单的锁更好?

您可以使用 Xamarin 开发 Linux 应用程序吗?

通过反射查找可空属性的类型

IronPython 与 Python .NET

泛型类的默认构造函数的语法是什么?

如果锁定的对象内部发生异常,它会保持锁定状态吗?

如何在我的机器上找到 fuslogvw.exe?

如何使用 XmlSerializer 将字符串序列化为 CDATA?