Как включить перечисление, которое имеет повторяющиеся значения или логические значения, в C #?

#c# #enums #switch-statement #boolean

#c# #перечисления #switch-statement #логическое

Вопрос:

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

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

Я хочу switch использовать это как:

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

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

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

Комментарии:

1. Почему формальный параметр «sn», а контроллер коммутатора «s»? Это опечатка, или вы хотите, чтобы они отличались?

Ответ №1:

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

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

Расширение для перечисления, которое вернет 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 этого экземпляра.

Комментарии:

1. Я предлагаю вам вместо этого использовать класс DefaultValueAttribute со значением по умолчанию true или false, таким образом, он вводится и добавляет некоторую семантическую информацию IMHO. Или вы могли бы также придумать определенный атрибут, который, вероятно, является лучшим.

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

3. я ИСПОЛЬЗУЮ SYSTEM. АТРИБУТ ПРЯМО СЕЙЧАС. СПАСИБО.

Ответ №2:

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

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

Ответ №3:

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

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

Комментарии:

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

2. Это не работает для типов перечислений, упомянутых конкретно в названии: с повторяющимися значениями. Вы пропустили всю суть вопроса и в то же время предложили плохой дизайн.