#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. Это не работает для типов перечислений, упомянутых конкретно в названии: с повторяющимися значениями. Вы пропустили всю суть вопроса и в то же время предложили плохой дизайн.