Присвоить несколько значений элементам enum - PullRequest
14 голосов
/ 21 декабря 2010

Привет, у меня есть это перечисление.

[Serializable]
public enum Country
{
    US      = 1,
    Canada  = 2,
}

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

(Country) Convert.ToInt32("1")

Теперь у меня есть 2 подрегионаСША и Канада, 1 и 2 для США и 3 & 4 для Канады.Поэтому, когда я делаю

(Country) Convert.ToInt32("1") или (Country) Convert.ToInt32("2"), я должен получить enum для US.и для 3 и 4 Канады.Как мне это реализовать?

[Serializable]
public enum Country
{
    US      = 1,2
    Canada  = 3,4
}

Как то так.Это, вероятно, не правильно, но просто чтобы дать вам идею.

Ответы [ 8 ]

13 голосов
/ 21 декабря 2010

enum может быть неправильной конструкцией для моделирования такого рода проблем.

Я бы предложил создать класс для представления информации о стране и предоставить методы преобразования в числовые представления и обратно. С такими проблемами вы также должны решить, какое значение кодирования вы будете использовать при преобразовании выбранного экземпляра Country в числовое значение.

Шаблон Enum Object может быть полезной отправной точкой для моделирования такой ситуации:

public sealed class Country
{
    // initialize appropriately in the constructor...
    private readonly int[] m_Values;
    private readonly string m_Name;

    // make the constructor private so that only this class can set up instances
    private Country( string name, int[] codes ) { ... }

    public static Country US = new Country("United States", new[]{ 1,2 } );
    public static Country Canada = new Country("Canada", new[] {3,4} );

    public static Country FromCode( int code ) { ... }
    public override string ToString() { return m_Name; }
    // ... etc...
}

Исходя из вашего примера, вы также должны подумать о том, нужно ли вам моделировать субрегионы стран как первоклассные объекты, а не просто складывать их в детали реализации перечисления вашей страны. Должны ли вы делать это или нет зависит от ваших требований и вариантов использования, поэтому только вы можете принять соответствующее решение.

11 голосов
/ 21 декабря 2010

Это невозможно.Тогда вам придется использовать отдельные значения.Если имена совпадают, например.

[Serializable]
[Flags]
public enum Country
{
    US      = 1,
    Canada  = 2,
    Northern = 4,
    Southern = 8
}

Вы можете сделать это: Countries = Country.US | Country.Northern.Если нет, вам нужно найти другой способ, возможно другое свойство или даже лучше, класс Location.

10 голосов
/ 21 декабря 2010

Вам нужно будет сделать что-то вроде этого:

class Region
{
    static readonly RegionMap = new Dictionary<int,string>
    {
        { 1, "US" },
        { 2, "US" },
        { 3, "Canada" }
        { 4, "Canada" }
    }

    public static string GetRegion(int code)
    {
        string name;
        if (!RegionMap.TryGetValue(code, out name)
        {
            // Error handling here
        }
        return name;
    }
}

Затем найдите строку на основе значения из базы данных:

string region = Region.GetRegion(dbVal);
5 голосов
/ 21 декабря 2010

Может как то так?

static Country ConvertRegionToCountry(string region)
{
    switch (region)
    {
        case "1":
        case "2":
            return Country.US;

        case "3":
        case "4":
            return Country.Canada;
    }
}
3 голосов
/ 23 декабря 2010
public Country GetCountry(int a)
        {
            if (a == 1 || a == 2)
            {
                return Country.USA;
            }
            else if (a ==  4|| a == 3)
            {
                return Country.Canada;
            }
        }  
3 голосов
/ 21 декабря 2010

Ах, я просто использовал функцию вместо прямой типизации. Гораздо проще, чем реализовать что-то совершенно другое. У меня уже есть много кода, работающего над этим, так что я не могу его сильно изменить, но вот что я сделал.

public Country GetCountryByTaxID(int taxID)
        {
            if (taxID == 3 || taxID == 4)
            {
                return Country.USA;
            }
            else 
            {
                return Country.Canada;
            }
        }  
0 голосов
/ 21 августа 2013

В дополнение к ответу dtb (и эквивалентным if предложениям) я только что реализовал «переопределенную» версию System.Convert в пространстве имен моего приложения:

public static class Convert
{
    public static object ChangeType
        (object value, Type conversionType, IFormatProvider provider)
    {
        int country;
        if (conversionType == typeof(Country)
            && int.TryParse(value.ToString(), out country))
        {
            switch (country)
            {
                case 1:
                case 2:
                    return Country.US;
                case 3:
                case 4:
                    return Country.Canada;
            }
        }

        // For most cases, including any country unmatched above...
        return System.Convert.ChangeType(value, conversionType, provider);
    }
}

Оригинальные методы mscorlib.dllКласс Convert теперь должен иметь префикс "System.", поэтому любые уточнения приветствуются!

0 голосов
/ 21 декабря 2010

Для меня это похоже на проблему сета, где 1 и 2 в наборе us, а 3 & 4 в наборе Canada.В кодовом проекте есть некоторый установленный код, который, я думаю, лучше моделирует проблему.

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