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, вы можете:
- создать полноценный класс C# и / или:
- использовать побитовую логику и / или:
- использовать Reflection и / или
- Enum.GetValues (TypeOf(...))