Рассмотрят следующий перечень:определить, если Enum с FlagsAttribute имеет уникальный бит значение
[Flags]
public enum EnumWithUniqueBitFlags
{
None = 0,
One = 1,
Two = 2,
Four = 4,
Eight = 8,
}
[Flags]
public enum EnumWithoutUniqueFlags
{
None = 0,
One = 1,
Two = 2,
Four = 4,
Five = 5,
}
Первая имеет значение такие, что любая комбинация будет производить уникальные комбинации бит, а второй не будет. Мне нужно программно определить это. До сих пор я только проверял, имеет ли каждая ценность две возможности, но это потому, что этот код будет использоваться для потребления Enums, разработанного другими, это непрактично.
var values = Enum.GetValues(typeof(TEnum)).OfType<TEnum>().ToList();
for (int i = 0; i < values.Count; i++)
{
if (((int) ((object) values [i])) != ((int) Math.Pow(2, i)))
{
throw (new Exception("Whatever."));
}
}
В отличие от кода выше, как программно может определить, что следующий Enum соответствует битовой комбинации единственности задачи (без предположений, таких как значения являются силы 2, и т.д.)?
[Flags]
public enum EnumWithoutUniqueFlags
{
Two = 2,
Four = 9,
Five = 64,
}
Пожалуйста, проигнорируйте, какой интегральный тип имеет перечисление, а также тот факт, что значения могут быть отрицательными.
Перечисление флагов, определяющее значения, которые не являются степенями двух, является общим - состояния наименования, которые являются суперпозициями состояний, определенных по степеням двух, могут быть полезны. –