如何在C#中获取所有枚举值的数组?

118

我有一个枚举类型,我想显示出所有可能的值。是否有一种方法可以获取枚举所有可能值的数组或列表,而不是手动创建这样的列表?例如,如果我有一个枚举:

public enum Enumnum { TypeA, TypeB, TypeC, TypeD }

我该如何获得一个包含{ TypeA, TypeB, TypeC, TypeD }List<Enumnum>呢?


4
可能是 将枚举转换为列表在c#中 的重复问题。 - Mark Byers
11个回答

205
这将使用 Enum.GetValues 使您获得枚举值的简单数组:
var valuesAsArray = Enum.GetValues(typeof(Enumnum));

这将为您提供一个通用列表:

var valuesAsList = Enum.GetValues(typeof(Enumnum)).Cast<Enumnum>().ToList();

6
这让我一直想知道为什么 Enumnum.GetValues()Enumnum.GetNames() 不存在。 - dalle
11
如果数组变量的元素类型在编译时已知,可以使用 var valuesAsArray = (Enumnum[])Enum.GetValues(typeof(Enumnum));。请注意,在翻译过程中,我保留了原文中的代码和变量名以确保准确性。 - Jeppe Stig Nielsen
或者 Enum.GetValues(typeof(Enumnum)).Cast<ActualType>().ToList(); - mr5
@mr5:在你的例子中,ActualType应该是什么意思?对于枚举类型,它将是OP示例中的Enumnum,或者它可以是底层类型(通常为int)。你还有其他想法吗? - Dirk Vollmar
如果您想要一个普通的数组,请使用以下代码: Enum.GetValues(typeof(TSomeEnum)).Cast<TSomeEnum>().ToArray();Enum.GetValues返回System.Array或者使用直接转换:(TSomeEnumType[])Enum.GetValues(typeof(TSomeEnumType))这是最简短的语法。如果您想要一个数组,上面的答案已经展示了如何实现。 - Tore Aurstad
如另一个答案所述,现在这个函数已经有了一个通用的重载。Enum.GetValues<Enumnum>(); - Kim

20

试试这段代码:

Enum.GetNames(typeof(Enumnum));

这将返回一个string[],其中包含所选枚举类型的所有枚举名称。


3
返回枚举值的名称;OP似乎想要得到枚举值本身 - Michael Petrotta

12

有了.NET 5.0中的泛型方法,现在这变得容易多了。

ColorEnum[] colors = Enum.GetValues<ColorEnum>();

微软文档:Enum.GetValues


8
Enum.GetValues(typeof(Enumnum));

返回枚举中值的数组。


7
您可以这样做:
public enum Enumnum { 
            TypeA = 11,
            TypeB = 22,
            TypeC = 33,
            TypeD = 44
        }

这个enum的所有整数值为11,22,33,44

你可以通过以下方式获取这些值:

var enumsValues = Enum.GetValues(typeof(Enumnum)).Cast<Enumnum>().ToList().Select(e => (int)e);

string.Join(",", enumsValues)的结果为11,22,33,44


5

您可以使用

Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToArray();

这会返回一个数组!

4
一些有所不同的东西:
typeof(SomeEnum).GetEnumValues();

2

如果您更喜欢一种更通用的方法,这里有一个。您可以根据需要添加更多的转换器。

    public static class EnumConverter
    {

        public static string[] ToNameArray<T>()
        {
            return Enum.GetNames(typeof(T)).ToArray();
        }

        public static Array ToValueArray<T>()
        {
            return Enum.GetValues(typeof(T));
        }

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


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

    }

示例实现:

   string[] roles = EnumConverter.ToStringArray<ePermittedRoles>();
   List<ePermittedRoles> roles2 = EnumConverter.ToListOfValues<ePermittedRoles>();
   Array data = EnumConverter.ToValueArray<ePermittedRoles>();

2
使用这个:
string[] myArray = Enum.GetNames(typeof(Enumnum));

您可以这样访问值数组:

Array myArray = Enum.GetValues(typeof(Enumnum));

1
Enum.GetValues不会返回一个string[]。 - messenger

1

这个问题是关于如何在C#中获取所有enum值的数组。

如果你想要获取选定的enum值的数组呢?

你的枚举类型

    enum WeekDays 
    {
        Sunday, 
        Monday,
        Tuesday
    }

如果您只想从枚举中选择 Sunday
  WeekDays[] weekDaysArray1 = new WeekDays[] { WeekDays.Sunday };

  WeekDays[] weekDaysArray2 = Enum.GetValues(typeof(WeekDays)).Cast<WeekDays>().Where
  (x => x == WeekDays.Sunday).ToArray();

感谢知识渊博的翻译。

参考资料:

1.

2.

希望能对某些人有所帮助。


这种方法对我很有效。也就是使用linq来设置数据后转换。 - Jamie Nicholl-Shelley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接