【问题标题】:Is there a way to make the user use a parameter from a predefined set?有没有办法让用户使用预定义集中的参数?
【发布时间】:2020-01-16 21:16:18
【问题描述】:

我想知道是否有可能让该方法强制您使用设置列表中的某些内容。

我想做什么的例子:


public static List<string> languages = new List<string>() { "cs", "de", "en", "es", "fr", "it", "jp", "nl", "ru", "zh" };

// Im trying to enforce the translate() method to make the parameter "transTo" one of the strings in the 
// list. I might be dumb and new but is this possible in c#?

public static void Translate(string path, string key, string transTo)
{
   ...
}

对堆栈溢出很陌生,告诉我我做错了什么:I

【问题讨论】:

  • languages 列表的内容是在编译时还是运行时确定的?例如。是否可以将语言添加到列表中,从而使新的语言代码有效?

标签: c# list methods parameters


【解决方案1】:

这是对枚举的完美使用:

enum LanguageCode
{
   cs,
   de,
   en
}

然后接受枚举:

public static void Translate(string path, string key, LanguageCode languageCode)
{
   ...
}

当然还有方法的调用:

Translate(path, myKey, LanguageCode.cs);

更好:您可以使用描述或字典来使选择更友好,但也可以满足您的内部要求:

public enum Language
{       
    English,
    Japanese,
    Spanish
}

private Dictionary<Language, string> LanguageMap = new Dictionary<Language, string>()
{
    {Language.English, "es"},
    {Language.Japanese, "jp"},
    {Language.Spanish, "es"}
}

然后,它会被用作:

 callExternalApi(stringToTranslate, LanguageMap[languageCode]);

【讨论】:

  • 这是一个很好的答案,一个警告。 C# 中的枚举不是很严格。它们本质上是带有一些类型检查信息的整数。我可以将任何int 转换为Language 值,它是有效的。因此,虽然此模式鼓励开发人员使用为 Language 定义的值之一,但您仍应检查传入的值是否是这些值之一,可能是 Enum.IsDefined
  • @JoeSewell 同意,并且像大多数事情一样,您也可以做一些很酷的事情,正因为如此。就像避免类型表查找的导航属性一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多