Как я могу успешно разыграть многозначный Enum? - PullRequest
0 голосов
/ 10 июня 2019

Проблема: Я могу вернуть строковое представление одного значения enum с помощью enum.ToString().В случаях многозначного enum (например: обозначается с помощью оператора OR |), все, что я получаю в вызове enum.ToString(), это целочисленное значение, поскольку enum не может parse.

Обходные пути / помехи: Я не могу создать несколько экземпляров одного и того же значения в 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.

Ожидания (или то, что я пытаюсь сделать):

Я ожидаю, что условие должно совпадать, поэтому 0 или 1 будет соответствовать English, и мой результат перечисления будет Languages.English, и, таким образом,возвращенная строка будет English, а не 1.

Вместо этого , по-видимому, происходит: вызов parse enum просто возвращается как int, а не как Language (ссылаясь на пример выше)так что, конечно, метод enum.ToString() возвращает int.

Для многозначных enum, где возможно, что для значений enum будет достаточно значений от 2 до x <= int.MaxValue, как я могу получить вызов для parse enum для приведенияуспешно к ожидаемому enum (что в результате вернет правильную строку в ответ на метод enum.ToString())?

1 Ответ

1 голос
/ 10 июня 2019

Я предлагаю использовать атрибут 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)
  ...
}
...