2010-06-23 3 views
1

Так что я хочу иметь свойство getter, которое возвращает значение перечисления на основе значения перечисления другого типа без необходимости использовать длинный оператор switch. Есть ли способ сопоставить два списка перечислений с использованием индекса или значений?C#: возвращаемое значение перечисления на основе значения перечисления другого типа перечисления

public enum LanguageName 
    { 
     Arabic, 
     Chinese, 
     Dutch, 
     English, 
     Farsi, 
     French, 
     Hindi, 
     Indonesian, 
     Portuguese, 
     Spanish, 
     Urdu 
    } 

    public enum LanguageISOCode 
    { 
     ara, 
     zho, 
     dut, 
     eng, 
     fas, 
     fre, 
     hin, 
     ind, 
     por, 
     spa, 
     urd 
    } 

public class language 
{ 
    public language() 
    { 
    } 

    public LanguageName Name 
    { 
     get 
     { 
      // get the Name enum based on the Code enum 
     } 
     set; 
    } 

    public LanguageISOCode Code 
    { 
     get; 
     set; 
    } 
} 

ответ

8

Вы можете явно объявить, что одно значение перечисления равно другому, например, так:

public enum LanguageName 
{ 
    Arabic, 
    Chinese, 
    Dutch, 
    ... 
} 

public enum LanguageISOCode 
{ 
    ara = LanguageName.Arabic, 
    zho = LanguageName.Chinese, 
    dut = LanguageName.Dutch, 
    ... 
} 

который затем позволит вам бросить между ними:

LanguageISOCode codeValue = LanguageISOCode.ara; 

LanguageName name = (LanguageName)(int)codeValue; 

или

LanguageName nameValue = LanguageName.Arabic; 

LanguageISOCode = (LanguageISOCode)(int)nameValue; 

В то время как вышеприведенное должно соответствовать Ваш конкретный вопрос, вы должны взглянуть на класс System.Globalization.CultureInfo. Это обеспечивает довольно много функциональности в отношении различных культур.

+0

Спасибо! Вы дали мне то, что, как я подозревал, было возможно. Благодарим за упоминание класса CultureInfo. –

+0

Отлично, только то, что я искал! –

2

Предполагая, что значения находятся в том же порядке, вы можете просто пройти через int преобразования первого:

public LanguageName Name 
{ 
    get 
    { 
     int n = (int) Code; 
     return (LanguageName)n; 
    } 
} 

Это потребовало бы, чтобы убедиться, что ваши перечисленные ценности всегда в правильном порядке, или что вы явно присвоить их численные значения:

public enum LanguageName 
{ 
    Arabic = 1, 
    Chinese = 2, 
    ... 
} 

public enum LanguageISOCode 
{ 
    ara = 1, 
    zho = 2, 
    ... 
} 

выше не требуется (поскольку стандарт гарантирует, что они получают назначения монотонно increa петь числовые значения), но по крайней мере он охватывает вас в случае, когда вы можете решить изменить порядок полей или что-то в этом роде.

1

Вы можете использовать одно и то же значение int в обоих, и отличать как int и делать как перечисление.

public enum LanguageName 
    { 
     Arabic = 1, 
     Chinese, 
     Dutch, 
     English, 
     Farsi, 
     French, 
     Hindi, 
     Indonesian, 
     Portuguese, 
     Spanish, 
     Urdu 
    } 

    public enum LanguageISOCode 
    { 
     ara = 1, 
     zho, 
     dut, 
     eng, 
     fas, 
     fre, 
     hin, 
     ind, 
     por, 
     spa, 
     urd 
    } 

public class language 
{ 
    public language() 
    { 
    } 

    public LanguageName Name 
    { 
     get 
     { 
      return (LanguageName)((int)Code); 
     } 
     set; 
    } 

    public LanguageISOCode Code 
    { 
     get; 
     set; 
    } 
} 

Или вы можете использовать другой подход, например использовать [Описание] и выполнить поиск.

3

Вы можете использовать Dictionary<LanguageName, LanguageISOCode> для явного сопоставления друг с другом.

Dictionary<LanguageName, LanguageISOCode> languageCodes = new Dictionary<LanguageName, LanguageISOCode> { 
    {LanguageName.Arabic,LanguageISOCode.ara}, 
    {LanguageName.Chinese,LanguageISOCode.zho}, 
    //... 
}; 

LanguageName lang = LanguageName.Arabic; 
LanguageISOCode code = languageCodes[lang]; 
Смежные вопросы