C #: вернуть значение перечисления на основе значения перечисления другого типа перечисления - PullRequest
1 голос
/ 23 июня 2010

Итак, я хочу получить свойство get, которое возвращает значение enum на основе значения enum другого типа без необходимости прибегать к длинному оператору switch.Есть ли способ сопоставить два списка enum, используя индекс или значения?

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;
    }
}

Ответы [ 4 ]

8 голосов
/ 23 июня 2010

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

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.Он обеспечивает довольно мало функциональности в отношении различных культур.

3 голосов
/ 23 июня 2010

Вы можете использовать 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];
2 голосов
/ 23 июня 2010

Предполагая, что значения находятся в одном и том же порядке, вы можете просто сначала выполнить 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,
    ...
}

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

1 голос
/ 23 июня 2010

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

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;
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...