Enum.GetValues()返回类型

时间:2009-09-09 09:54:17

标签: c# enums

我已阅读文档,声明'给定枚举的类型,System.Enum的GetValues()方法将返回给定枚举的基本类型的数组'即int,byte等

但是我一直在使用GetValues方法,所有我一直回来的是一个Enums类型的数组。我错过了什么吗?


public enum Response
{
    Yes = 1,
    No = 2,
    Maybe = 3
} 

foreach (var value in Enum.GetValues(typeof(Response))) { var type = value.GetType(); // type is always of type Enum not of the enum base type }

由于

6 个答案:

答案 0 :(得分:83)

您需要将结果转换为您想要的实际数组类型

(Response[])Enum.GetValues(typeof(Response))

因为GetValues没有强类型

编辑:重新阅读答案。您需要将每个枚举值显式转换为基础类型,因为GetValues返回实际枚举类型的数组而不是基类型。 Enum.GetUnderlyingType可以帮助解决这个问题。

答案 1 :(得分:29)

如果你使用的是.NET 3.5(即你有LINQ),你可以这样做:

var responses = Enum.GetValues(typeof(Response)).Cast<Response>();

答案 2 :(得分:11)

就我个人而言,我在我的Utils项目中创建了一个单独的方法,我将其包含在我的其他项目中。这是我使用的代码:

public static class EnumUtil
{
    public static IEnumerable<TEnum> GetAllValues<TEnum>() 
        where TEnum : struct, IConvertible, IComparable, IFormattable
    {
        return Enum.GetValues(typeof(TEnum)).Cast<TEnum>();
    }   
}

我称之为:

var enumValues = EnumUtil.GetAllValues<Response>();

答案 3 :(得分:7)

您能参考您提到的文件吗? MSDN documentation on Enum.GetValues没有提到类似的内容(引自该页面):

  

返回值

     

输入:System.Array

     

一个数组   enumType中常量的值。   数组的元素已排序   通过二进制值   枚举常数。

答案 4 :(得分:4)

作为评论中提到的Roger,如果有Enum.GetValues<MyEnum>()通用实现,那就更好了,但是没有。

这个问题也让我很烦恼,所以我在C ++ / CLI中创建了a library,它具有Enum类上所有静态方法的通用实现(以及一堆用于枚举的其他通用方法。)

库是用C ++ / CLI编写的,因为C#不支持通过System.Enum约束泛型类型。 C ++ / CLI(和CLR)支持System.Enum和C#/ VB.NET的约束,理解对具有此约束的方法的调用没有问题。

如果是您的示例,您可以使用Enums.GetValues<MyEnumType>(),它将为您提供MyEnumType数组而无需强制转换。虽然C#和VB.Net不支持定义枚举约束,但是它们没有使用具有这种约束的方法/类和intellisense /编译器完美处理它的问题。

答案 5 :(得分:2)

Joel's Answer类似,但做法略有不同:

public static class Enums<T>
  where T : struct, IComparable, IFormattable, IConvertible
{
  static Enums()
  {
    if (!typeof(T).IsEnum)
      throw new ArgumentException("Type T must be an Enum type");  
  }

  public static IEnumerable<T> GetValues()
  {
    var result = ((T[])Enum.GetValues(typeof(T)).ToList()

    return result;
  }
}

用法:

IEnumerable<System.Drawing.FontStyle> styles = Enums<System.Drawing.FontStyle>.GetValues();