gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:03:56 29 4
gpt4 key购买 nike

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

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

那么在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com