为了允许从源代码中提取所有可翻译的消息,我们希望使用特定的“语义”Message
类。只有消息可以呈现给 UI。通过这种方式,我们希望防止 UI 中出现太多未翻译的字符串。
但是 gettext 提取引擎无法提取像 Message.Create("a"+ x)
这样的事件。
那么 C# 中有没有一种方法可以确保我的函数(GetText._
等)仅使用字符串文字调用?
或者我应该以某种方式恢复预处理?有没有可以做到这一点的库/工具?
最佳答案
该语言中没有任何内容支持参数必须是字符串文字,不是。我个人认为这将是一个奇怪的语言“功能”。
我建议创建一个 MessageTemplate
类或类似的东西,并更改您的方法以接受 MessageTemplate
参数。
MessageTemplate
类可以拥有一组特定的实例,其中包含您需要的所有字符串。例如:
public sealed class MessageTemplate
{
public static MessageTemplate InvalidFilter { get; } =
new MessageTemplate("invalid_filter");
public static MessageTemplate Success { get; } =
new MessageTemplate("success");
public string Name { get; }
private MessageTemplate(string name) => Name = name;
}
那么方法调用将是这样的:
Message.Create(MessageTemplate.Success);
优点:
- 有效字符串都位于一个位置,而不是分散在代码库中
- 即使底层字符串名称不太有用(例如“x”),调用代码也可以使用有用的名称(例如“Success”),这样更易于阅读
- 您可以安全地传递
MessageTemplate
引用,因为知道它们是消息模板而不仅仅是任意字符串
如果您真的只想接受字符串文字,那么最好的选择可能是为此目的创建一个属性,然后编写一个 Roslyn 分析器。这将检查每个方法调用,并验证参数是否具有该属性,参数是否为字符串文字。
我个人认为,将这些神奇的、脆弱的字符串常量分散在整个代码库中会产生不良影响,但这是您所要求的最接近的精确行为。当然,它只有在使用 Roslyn 构建时才会有效。
关于c# - 我可以限制 C# 函数仅接受字符串文字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49645032/