【问题标题】:Can I restrict a C# function to accept string literals only?我可以限制 C# 函数只接受字符串文字吗?
【发布时间】:2018-04-04 07:20:38
【问题描述】:

为了允许从源代码中提取所有可翻译的消息,我们希望使用特定的“语义”Message 类。只有消息可以呈现给 UI。通过这种方式,我们希望防止 UI 中出现太多未翻译的字符串。

但是gettext提取引擎无法提取像Message.Create("a" + x)这样的事件。

那么在 C# 中是否有办法确保我的函数(GetText._ 等)仅使用字符串字面量调用?

或者我应该以某种方式恢复到预处理?是否有任何库/工具可以做到这一点?

【问题讨论】:

  • 究竟是什么?
  • @TheGeneral 我会详细说明“为什么”
  • 也许你应该使用枚举,至少你的奇怪要求显然是xy-problem
  • 我投票结束这个问题,因为这显然是一个 xy 问题,但 OP 没有提供足够的细节来建议不同的方法
  • "提取所有可翻译的消息" 将这些消息存储在资源文件中怎么样?您将它们全部放在一个地方,翻译只需要更改 1 行代码...

标签: c# gettext type-constraints


【解决方案1】:

语言中没有任何东西支持必须是字符串文字的参数,不。我个人认为这将是一个奇怪的语言“功能”。

我建议改为创建一个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 一起构建时才会生效。

【讨论】:

  • 我个人认为这将是一个奇怪的语言“功能” - 对用户进行练习:使用 Roslyn 更改 C# 语言,以便 string 文字 以某种方式不同...
  • @Rawling:我怀疑编写 Roslyn 分析器以便您可以将属性添加到方法参数,然后检查对该方法的所有调用,如果出现警告,则会发出警告相应的参数不是字符串文字。对于这种情况,我当然更喜欢我在这里给出的答案:)
  • 这显然是一种更好的方法,与在你的代码中使用魔法字符串分散调用相比,但它仍然解决了问题。最后,除了代码审查或一些预处理工具之外,没有任何东西可以确保您的帮助程序类返回的任何消息实际上都是字符串文字。
  • 我不会试图强制执行这个奇怪的规则,而是会寻找不同的解决方案来解决这个问题。当必须根据条件写入其中一条消息时会发生什么?
  • @InBetween:我对这个问题的理解并不是它是一个重要的字符串文字,而是它只是一组固定的字符串,可以接受。模板类强制只使用固定的字符串集。是的,该类需要检查以确保字符串正确,但仅此而已。
猜你喜欢
  • 1970-01-01
  • 2014-06-06
  • 2012-11-23
  • 2019-12-03
  • 2011-01-03
  • 2012-02-27
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
相关资源
最近更新 更多