Перечислить подмножество или подгруппу в C # - PullRequest
21 голосов
/ 06 февраля 2009

У меня есть существующее перечисление с многочисленными элементами.

У меня также есть существующий код, который делает определенные вещи с этим enum.

Теперь мне нужен способ просмотра только членов набора enum. То, что я ищу, это способ разделить мое перечисление на группы. Мне нужно сохранить значение (int) каждого члена, и мне нужно сохранить возможность просмотра всех членов enum, если это необходимо.

Единственное, о чем я могу думать, - это просто создать новое перечисление для каждого подменю, которое содержит только те элементы, которые я хочу, используя то же имя и значение.

Это работает, но нарушает весь принцип отсутствия повторения.

Я не ожидаю, что у кого-то будет лучшая альтернатива, но я подумал, что спросить на всякий случай, если у кого-нибудь есть причудливый прием, чтобы показать мне.

Спасибо, как всегда.

Ответы [ 5 ]

13 голосов
/ 11 августа 2010

Я бы пошел с этим (который работает в VB.NET по крайней мере)

enum MySuperEnumGroup 
{ 
  Group1Item1, 
  Group1Item2, 
  Group1Item3, 

  Group2Item1, 
  Group2Item2, 
  Group2Item3, 

  Group3Item1, 
  Group3Item2, 
  Group3Item3, 
} 

enum MySubEnumGroup 
{
Group2Item1 = MySuperEnumGroup.Group2Item1 
Group3Item1 = MySuperEnumGroup.Group3Item1 
Group3Item3 = MySuperEnumGroup.Group3Item3
}

Тогда сделайте какой-нибудь тип CType, когда вам нужно.

10 голосов
/ 06 февраля 2009

Вы можете определить значения, используя перечисление, но затем ссылаться на них через константы в статических классах, чтобы ваши разработчики не сталкивались с большим перечислением. Вы могли бы иметь:

enum MySuperEnumGroup
{
  Group1Item1,
  Group1Item2,
  Group1Item3,

  Group2Item1,
  Group2Item2,
  Group2Item3,

  Group3Item1,
  Group3Item2,
  Group3Item3,
}

static class MySuperEnumGroup_Group1
{
  public const MySuperEnumGroup Item1 = MySuperEnumGroup.Group1Item1;
  public const MySuperEnumGroup Item2 = MySuperEnumGroup.Group1Item2;
  public const MySuperEnumGroup Item3 = MySuperEnumGroup.Group1Item3;
}

static class MySuperEnumGroup_Group2
{
  public const MySuperEnumGroup Item1 = MySuperEnumGroup.Group2Item1;
  public const MySuperEnumGroup Item2 = MySuperEnumGroup.Group2Item2;
  public const MySuperEnumGroup Item3 = MySuperEnumGroup.Group2Item3;
}

//etc.
4 голосов
/ 07 июня 2017

Если перечисления не имеют явных значений, присвойте им одно и используйте флаги для определения «группировок»:

[Flags]
enum MySuperEnumGroup
{
    Group1 = 1 << 0,
    Group2 = 1 << 1,
    Group3 = 1 << 2,

    Group1Item1 = 1 << 10 | Group1,
    Group1Item2 = 1 << 11 | Group1,
    Group1Item3 = 1 << 12 | Group1,

    Group2Item1 = 1 << 13 | Group2,
    Group2Item2 = 1 << 14 | Group2,
    Group2Item3 = 1 << 15 | Group2,

    Group3Item1 = 1 << 16 | Group3,
    Group3Item2 = 1 << 17 | Group3,
    Group3Item3 = 1 << 18 | Group3,
}

Затем вы можете использовать Enum.GetValues и HasFlag, чтобы получить значения для данной "группировки":

var group1 = Enum.GetValues(typeof(MySuperEnumGroup))
                 .Cast<MySuperEnumGroup>()
                 .Where(value => value.HasFlag(MySuperEnumGroup.Group1))
                 .ToArray();
3 голосов
/ 06 февраля 2009
2 голосов
/ 05 марта 2009

В конце концов, мне пришлось переписать большую часть кода, но был получен следующий «трюк»:

Я уничтожил перечисления C # и использую статические члены в обычном классе. Этот класс был преобразован в одноэлементный и запускается при запуске приложения.

Конструкторам моих статических членов разрешено ссылаться на другой статический член как на «родительский».

Далее, мой метод init использует отражение для прохождения каждого статического члена и индексирует их на основе нескольких свойств. Эти индексы хранятся в хеш-таблицах, которые также являются членами singleton.

Я, таким образом, получаю:

одноэлементный объект, который:

  • имеет статические элементы, к которым можно легко получить доступ во время разработки.
  • может использоваться во время выполнения для поиска определенных статических элементов (на основе «группы» и других свойств).

Мой метод инициализации выполняет достаточную проверку. Если создаются недопустимые (например, повторяющиеся) статические элементы, вы получаете ошибку времени выполнения при запуске приложения.

Очевидно, довольно большой взлом, но я вполне доволен этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...