Как включить enum, который имеет повторяющиеся значения или логические значения, в C #? - PullRequest
0 голосов
/ 16 апреля 2011

Учитывая тип перечисления:

enum SOMEENUM 
{
   A = true,
   B = false,
   C = true
}

Я хочу switch на этом как:

public void SWITCHON (SOMEENUM sn) 
{
   switch(s)
   {
      case SOMEENMUM.A : xxxxxxxx.......
   }
}

Но это не компилируется;Я предполагаю, что он использует значение bool перечисления.

Я хочу включить Enum, как будто ему не присвоено значение.

Ответы [ 3 ]

3 голосов
/ 16 апреля 2011

Прежде всего:
Перечисления в C # не поддерживают bool как значение.Так должно быть целыми числами.Если мы установим 2 свойства enum в одно и то же значение, мы можем считать одно из них потерянным.Насколько я понимаю, что вы на самом деле пытаетесь сделать так: каким-то образом отметьте, что 2 свойства enum равны.
Мое предложение:

public enum MyEnum
{
    [Description("true")]
    A = 1,
    [Description("false")]
    B = 2,
    [Description("true")]
    C = 3
}

Расширение для Enum, которое будет возвращать bool

 public static class EnumEx
    {
        public static bool GetDescriptionAsBool(this Enum value)
        {
            FieldInfo field = value.GetType().GetField(value.ToString());
            DescriptionAttribute attribute
                    = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute))
                        as DescriptionAttribute;
            if(attribute == null)
            {
                //throw new SomethingWentWrongException();
            }
            return bool.Parse(attribute.Description);
        }
    }

В результате вы можете переключаться в обычном режиме и в любое время можете проверить, какой у вас флаг списка перечислений, просто вызвав метод GetDescriptionAsBool этого экземпляра.

2 голосов
/ 16 апреля 2011

Повторяющиеся значения - это просто разные имена для одной и той же вещи.Невозможно определить разницу, потому что перечисления хранятся как значения, а не как имена.

Что касается значений bool, вы используете if для них вместо switch. * 1006.*

0 голосов
/ 16 апреля 2011

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

enum SOMEENUM 
{ 
   A, 
   B,
   C
}

так

public void SWITCHON (SOMEENUM s) 
{
    switch(s) 
    { 
        case SOMEENMUM.A : ...do stuff...
             break;
        case SOMEENMUM.B : ...do stuff...
             break;
        case SOMEENMUM.c : ...do stuff...
             break;
    }
}
...