Как мне перечислить перечисление в C #? - PullRequest
3455 голосов
/ 20 сентября 2008

Как вы можете перечислить enum в C #?

например. следующий код не компилируется:

public enum Suit 
{
    Spades,
    Hearts,
    Clubs,
    Diamonds
}

public void EnumerateAllSuitsDemoMethod() 
{
    foreach (Suit suit in Suit) 
    {
        DoSomething(suit);
    }
}

И выдает следующую ошибку во время компиляции:

«Костюм» является «типом», но используется как «переменная»

Не удалось выполнить ключевое слово * 1013, второе.

Ответы [ 27 ]

8 голосов
/ 08 апреля 2014

Я знаю, что это немного грязно, но если вы поклонник однострочников, вот один:

((Suit[])Enum.GetValues(typeof(Suit))).ToList().ForEach(i => DoSomething(i));
7 голосов
/ 12 сентября 2014

Простой и универсальный способ преобразовать перечисление во что-то, с чем вы можете взаимодействовать:

public static Dictionary<int, string> ToList<T>() where T : struct
{
   return ((IEnumerable<T>)Enum
       .GetValues(typeof(T)))
       .ToDictionary(
           item => Convert.ToInt32(item),
           item => item.ToString());
}

А потом:

var enums = EnumHelper.ToList<MyEnum>();
7 голосов
/ 01 октября 2015

Что если вы знаете, что типом будет enum, но вы не знаете, какой именно тип будет во время компиляции?

public class EnumHelper
{
    public static IEnumerable<T> GetValues<T>()
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }

    public static IEnumerable getListOfEnum(Type type)
    {
        MethodInfo getValuesMethod = typeof(EnumHelper).GetMethod("GetValues").MakeGenericMethod(type);
        return (IEnumerable)getValuesMethod.Invoke(null, null);
    }
}

Метод getListOfEnum использует отражение, чтобы взять любой тип перечисления и возвращает IEnumerable всех значений перечисления.

Использование:

Type myType = someEnumValue.GetType();

IEnumerable resultEnumerable = getListOfEnum(myType);

foreach (var item in resultEnumerable)
{
    Console.WriteLine(String.Format("Item: {0} Value: {1}",item.ToString(),(int)item));
}
4 голосов
/ 31 марта 2017

Добавьте метод public static IEnumerable<T> GetValues<T>() в ваш класс, например

public static IEnumerable<T> GetValues<T>()
{
    return Enum.GetValues(typeof(T)).Cast<T>();
}

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

 public static void EnumerateAllSuitsDemoMethod()
 {
     // custom method
     var foos = GetValues<Suit>(); 
     foreach (var foo in foos)
     {
         // Do something
     }
 }
1 голос
/ 11 октября 2017

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

(На самом деле, это немного сложнее - считается, что типы перечислений имеют «базовый» целочисленный тип, что означает, что каждое значение перечисления соответствует целочисленному значению (обычно это неявное, но может быть указано вручную) C # был спроектирован таким образом, чтобы вы могли вставить любое целое число этого типа в переменную enum, даже если это не "именованное" значение.)

Метод System.Enum.GetNames можно использовать для получения массива строк, которые являются именами значений перечисления, как следует из названия.

РЕДАКТИРОВАТЬ: должен был предложить вместо System.Enum.GetValues ​​ метод. К сожалению.

0 голосов
/ 26 апреля 2019
Enum.GetNames(typeof(Suit)).ToList();

Не знаю, зачем тебе это нужно. но вы можете сделать как linq:

Enum.GetValues(typeof(Suit))
    .Cast<Suit>()
    .ToList()
    .ForEach(e =>
    {
        e.GetHashCode().Dump();
        e.Dump();
    });
0 голосов
/ 10 января 2017

Также вы можете привязать к общедоступным статическим членам перечисления напрямую, используя отражение:

typeof(Suit).GetMembers(BindingFlags.Public | BindingFlags.Static)
    .ToList().ForEach(x => DoSomething(x.Name));
...