如何成功转换多值枚举?

How Can I Successfully Cast a Multi-Valued Enum?

问题: 我可以 return 具有 enum.ToString() 的单值 enum 的字符串表示形式。在多值 enum 的情况下(例如:使用 OR 运算符 | 表示),我在 enum.ToString() 调用中得到的只是整数值,因为 enum 无法 parse.

Work-arounds/Hindrances: 我无法在 enum 中创建多个具有相同值的实例,例如:

public enum Languages: int
{
     English = 0, // From American English
     English = 1, // From UK English
     Spanish = 2, // From Castillian Spanish
     Spanish = 3, // From Latin American Spanish
     Portuguese = 4 // From Brasilian Portuguese
     Portuguese = 5, // From European Portuguese
}

因为这违反了标准,IDE 对此非常皱眉。

问题示例:

public enum Languages: int
{
     English = 0 | 1,   // American or UK
     Spanish = 2 | 3,   // Castillian or Latin American
     Portuguese = 4 | 5,   // Brasil or Portugal
     MyMadeUpLanguage = 6,     
}

int selectedLanguage = 1;
Languages result = (Languages)Enum.Parse(typeof(Languages), selectedLanguage);
string resultString = result.ToString();  // This is where '1' is returned and not English.

int nextSelectedLanguage = 6;
Languages differentResult = (Languages)Enum.Parse(typeof(Languages), nextSelectedLanguage);
string nextResultString = differentResult.ToString();  // This returns 'MyMadeUpLanguage', as we would expect.

期望(或我正在尝试做的事情):

我期望的是条件应该匹配,所以 01 将匹配 English 并且我的枚举结果将是 Languages.English 并且,因此,字符串 returned 将 English 而不是 1

相反,似乎 发生的是对 parseenum 的调用只是 return 作为 int 而不是 Language 类型(参考上面的示例),所以 - 当然 - enum.ToString() 方法 return 是 int

对于多值 enum2x <= int.MaxValue 值可能足以满足 enum,我怎样才能调用 parseenum 成功转换为预期的 enum (这将在 enum.ToString() 方法的 return 中返回正确的字符串)?

我建议使用 Flags 属性,例如:

[Flags]
public enum Languages: int
{
     None = 0,                      // None 

     English    = 1 << 30,          // Languages  
     Spanish    = 1 << 29,  
     Portuguese = 1 << 28,   
     MyMadeUpLanguage = 1 << 27, 

                                    // Dialects
     EnglishUS = English | 1,       // From American English
     EnglishGB = English | 2,       // From UK English
     EnglishCA = English | 3,       // From Canada English
     SpanishES = Spanish | 1,       // From Castillian Spanish
     SpanishLA = Spanish | 2,       // From Latin American Spanish
     PortugueseBR = Portuguese | 1, // From Brasilian Portuguese
     PortuguesePT = Portuguese | 2, // From European Portuguese 

     MyMadeUpLanguageDialect1 = MyMadeUpLanguage | 1
}

典型比较:

Languages selectedLanguage ...

if (Languages.EnglishGB & Languages ==  Languages.EnglishGB) {
  // From Exactly English Great Britain
  ...
}

if (Languages.English & Languages == Languages.English) {
  // From some kind of English (Great Britain, or US dialect)
  ...
}