c# - 我可以限制 C# 函数仅接受字符串文字吗?

标签 c# gettext type-constraints

为了允许从源代码中提取所有可翻译的消息,我们希望使用特定的“语义”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/

相关文章:

java - gettext-commons 找不到资源包

.net - F# 静态成员约束结合 IDisposable

haskell - 如何将两种类型约束与逻辑或 Haskell 结合起来?

c# - 使用 DataGridTemplateColumn.CellTemplate 并绑定(bind)到数据表时,DataGrid 中的重复列

c# - 像 stackoverflow 一样的标签控件

c# - 如何针对特定条件扩展 WPF 窗口?

git - Homebrew 安装的 gettext 和 git 不兼容?

c# - 两个 gridviews 一个 RowDataBound

php - PoEdit 和 PHP 注释

c# - 如何解决 C# 中泛型类型约束的限制?