Как получить набор значений перечисления в C #? - PullRequest
3 голосов
/ 15 декабря 2011

Предположим, у меня есть перечисление :

namespace System.Windows.Forms
{
   public enum DialogResult { None, OK, Cancel, Abort, Retry, Ignore, Yes, No }
}

я хочу объявить "набор" , составленный из перечисленных типов

ShowForm(Form frm, DialogResults allowedResults)

На других языках вы бы заявили:

public DialogResults = set of DialogResult;

И тогда я могу использовать

ShowForm(frm, DialogResult.OK | DialogResult.Retry);

C # имеет понятие Флаги , псевдокод:

[Flags]
public enum DialogResults { DialogResult.None, DialogResult.OK, DialogResult.Cancel, DialogResult.Abort, DialogResult.Retry, DialogResult.Ignore, DialogResult.Yes, DialogResult.No }

проблема в том, что это не настоящий код - Flags не указывает компилятору создавать набор флагов.

  • в одном случае тип должен разрешать только одно значение (DialogResult)
  • в другом случае тип должен разрешать несколько значений выше (DialogResults)

Как мне получить "набор" перечисляемых типов?

Примечание : я предполагаю, что это невозможно в C #. Если это ответ: можно так сказать - на вопрос дан ответ.

Примечание : Только то, что я считаю, что в языке C # нет функции, не означает, что у нее нет функции - возможно, я просто еще не нашел ее.


Обновление: Другой пример:

Предположим, у меня есть перечисление:

public enum PatronTier 
{ 
    Gold = 1,      
    Platinum = 2,  
    Diamond = 3,   
    SevenStar = 7  //Yes, seven
}

я хочу объявить "набор" , составленный из перечисленных типов

public Tournament
{
   public PatronTiers EligibleTiers { get; set; }
}

На других языках вы бы заявили:

public PatronTiers = set of PatronTier;

И тогда я могу использовать:

tournament.EligibleTiers = PatronTier.Gold | PatronTier.SevenStar;

C # имеет понятие Флаги , псевдокод:

[Flags]
public enum PatronTiers { PatronTier.Gold, PatronTier.Platinum, PatronTier.Diamond, PatronTier.SevenStar }

проблема в том, что это не настоящий код.

Как мне получить "набор" перечисляемых типов?

Ответы [ 3 ]

6 голосов
/ 15 декабря 2011

Похоже, вы хотите множество вещей. В C # есть типы массивов, но ничего, что прямо не эквивалентно вашим примерам с точки зрения поддержки компилятора, возможно, ближайший DialogResults[], массив DialogResults.

Попробуйте указать HashSet разрешенных вами предметов. HashSet<T> реализует ISet<T>, и обычно лучше работать с интерфейсами, чем с конкретными типами, особенно для сигнатур методов:

ShowForm(Form frm, ISet<DialogResults> allowedResults);

Затем вы можете использовать Contains для проверки предметов:

if (allowedResults.Contains(DialogResults.OK))
{
}

Несколько бессмысленная альтернатива: вы всегда можете реализовать свой собственный тип Set<Enum>, используя Неограниченную мелодию Джона Скита , чтобы дать вам более хороший синтаксис с точки зрения вызывающего и получить немного ближе к вашим примерам.

1 голос
/ 15 декабря 2011

Я не думаю, что вы просто имеете в виду что-то подобное?

var DialogResults = Enum.GetValues(typeof(DialogResult));

с .Select(dr => (DialogResult)dr).ToArray(), если вы хотите, чтобы он печатался строго

0 голосов
/ 15 декабря 2011

Я думаю, вы хотите что-то вроде этого:

foreach (var item in System.Enum.GetValues(typeof(PatronTier)))
{
    Console.WriteLine(item);
}
...