У меня есть следующий набор перечислений:
[Flags]
public enum Categories : uint
{
A = (1 << 0),
B = (1 << 1),
B1 = B | (1 << 16),
B2 = B | (1 << 17),
B3 = B | (1 << 18),
B4 = B | (1 << 19),
B5 = B | (1 << 20),
C = (1 << 2),
C1 = C | (1 << 21),
D = (1 << 3),
D1 = D | (1 << 22),
D2 = D | (1 << 23),
E = (1 << 4),
F = (1 << 5),
F1 = F | (1 << 23),
F2 = F | (1 << 24),
F3 = F | (1 << 25),
F4 = F | (1 << 26),
F5 = F | (1 << 27),
G = (1 << 6),
H = (1 << 7),
H1 = H | (1 << 28),
}
Идея состоит в том, что перечисления представляют собой иерархическую структуру, в которой дочернее перечисление подразумевает своего родителя, и может быть применено любое количество флагов.
Проблема, которую я вижу, заключается в том, что все дочерние перечисления не представляются во время отладки в виде имен или наборов имен. Т.е., Categories.F
= "F", но Categories.F2
= 16777248. Я бы надеялся, что Categories.F2
= "F, F2" или хотя бы "F2"
Как я могу сделать так, чтобы мои перечисления оставались распознанными как флаги? Есть ли лучший способ выполнить то, что я пытаюсь сделать?
Categories.F2.ToString() = "F2"
- person p.s.w.g   schedule 06.04.2013[DebugerDisplay("{ToString()}")]
, это повлияет? - person p.s.w.g   schedule 06.04.2013[Flags] enum Categories { F = 1, F2 = 1 | 2, }
. ЗначениеCategories
с базовым числовым значением3
будет отображаться отладчиком как"3"
, тогда как.ToString()
и.ToString("F")
дают"F2"
. Похоже на ошибку. - person Jeppe Stig Nielsen   schedule 06.04.2013[DebuggerDisplay("{ToString()}")]
(при сохранении[Flags]
, конечно) работает (пространство именusing System.Diagnostics
). Затем отладчик показывает то же самое, что иToString()
. Но странно, что это необходимо. Почему алгоритм отладчика по умолчанию отличается отToString()
? - person Jeppe Stig Nielsen   schedule 06.04.2013DebuggerDisplay
иDebuggerTypeProxy
в свой ответ для полноты картины. - person p.s.w.g   schedule 06.04.2013