Я придумал этот фрагмент кода, который преобразует установленные флаги в переменную типа Перечисление флагов и возвращает установленные флаги как целые числа. Я хотел бы знать, является ли это лучшим подходом.
Пример перечисления:
[Flags]
enum Status {
None = 0x0,
Active = 0x1,
Inactive = 0x2,
Canceled = 0x4,
Suspended = 0x8
}
Метод расширения, который преобразует установленные флаги в массив int, который я придумал:
public static class Extensions
{
public static int[] ToIntArray(this System.Enum o)
{
return o.ToString()
.Split(new string[] { ", " }, StringSplitOptions.None)
.Select(i => (int)Enum.Parse(o.GetType(), i))
.ToArray();
}
}
Вот как я его использую:
Status filterStatus = Status.Suspended | Status.Canceled;
int[] filterFlags = filterStatus.toIntArray();
foreach (int flag in filterFlags) {
Console.WriteLine("{0}\n", flag);
}
Он выведет:
4
8
Как видите, для этого я делаю следующее:
- Преобразование переменной в строку. Выводит что-то вроде: Suspended, Canceled
- Разделение этой строки на массив строк: { "Приостановлено", "Отменено" }
- Преобразование этой строки в значение перечисления с помощью Enum.Parse.
- Приведение значения к целому числу.
- Преобразование IEnumerable в int[].
Это работает, но я просто не думаю, что это лучший подход. Любые предложения по улучшению этого фрагмента кода?
enum
основаны наint
как на базовом типе, поэтому приведение может завершиться ошибкой. - person Ben Voigt   schedule 09.07.2010