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

时间:2018-04-04 07:20:39

标签: c# gettext type-constraints

为了允许从源代码中提取所有可翻译的消息,我们希望使用特定的语义' Message课程。只有消息可以呈现给UI。这样我们就可以防止在UI中出现太多未翻译的字符串。

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

那么在C#中是否有一种方法可以确保我的函数(GetText._之类)只用字符串文字调用?

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

1 个答案:

答案 0 :(得分:2)

语言中没有任何内容可以支持必须是字符串文字的参数,不。我认为这将是一种奇怪的语言"功能",个人。

我建议的是创建一个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);

优点:

  • 有效的字符串都在一个地方,而不是分散在代码库中
  • 即使基础字符串名称不太有用(例如&#34; x&#34;),调用代码也可以使用有用的名称(例如&#34; Success&#34;),这样可以更容易阅读< / LI>
  • 您可以安全地传递MessageTemplate个引用,因为他们知道消息模板,而不仅仅是任意字符串

如果确实只想接受字符串文字,那么最好的办法就是为此目的创建一个属性,然后编写一个Roslyn分析器。这将检查每个方法调用,并验证如果参数具有该属性,则参数是字符串文字。

就我个人而言,我认为在整个代码库中散布这些神奇,脆弱的字符串常量会产生不良影响,但它是您最接近完全行为的最佳行为。已请求。当然,只有在使用Roslyn构建时才会产生效果。

相关问题