EnumSet в C#, когда нужна группировка по уровням

В Java у меня есть:

public enum MyEnum{

    Value1,
    Value2,
    Value3,
  //so on
    }

И класс, который будет иметь свойство:

public abstract class MyClass{
public EnumSet<MyEnum> myEnum= EnumSet.noneOf(MyEnum.class); }

Но также есть интерфейс уровня, который группирует MyEnum по уровням:

public interface Level{


public EnumSet<MyEnum> LEVEL0 = EnumSet.of(Value1,
                                                Value2,
                                                //etc;}
  public EnumSet<MyEnum> LEVEL1 = EnumSet.of(Value3,
                                                    Value4,
                                                    //etc;}

Также используются функции, используемые в myEnum, такие как clone(),addAll(). Как мне относиться к этим случаям с точки зрения C#?

1 ответ

Я бы предложил использовать атрибут [Flags], как описано в документации Microsoft.

[Flags]
public enum MyEnum
{
    None = 0,
    Value1 = 1 << 0,
    Value2 = 1 << 1,
    Value3 = 1 << 2,
    Value4 = 1 << 3,
    //so on
}

public abstract class MyClass
{
    public MyEnum myEnum = MyEnum.None;

    public void testing()
    {
        // Initialize with two flags using bitwise OR.
        MyEnum workingFlags = MyEnum.Value1 | MyEnum.Value3;

        // Set an additional flag using bitwise OR.
        workingFlags= workingFlags| MyEnum.Value4;
        // workingFlags: Value1, Value3, Value4

        // Remove a flag using bitwise XOR.
        workingFlags = workingFlags ^ MyEnum.Value3;
        // workingFlags: Value1, Value4

        // Test value of flags using bitwise AND.
        bool test = (workingFlags & MyEnum.Value3) == MyEnum.Value3;
        // test = true;
    }
}

public abstract class Level
{
    public MyEnum LEVEL0 = MyEnum.Value1 | MyEnum.Value2;
    public MyEnum LEVEL1 = MyEnum.Value3 | MyEnum.Value4;
}

Интерфейсы C# не могут иметь свойства со значениями в нем. В Java это может, но не должно, и они действительно являются константами. Смотрите этот ответ для получения дополнительной информации.

Перечисления C# являются константами, перечисления Java являются классами. Для достижения функциональности, аналогичной Java, вы можете:

  1. создать полноценный класс C# и / или:
  2. использовать побитовую логику и / или:
  3. использовать Reflection и / или
  4. Enum.GetValues ​​(TypeOf(...))
Другие вопросы по тегам