Enum.GetValues()返回types

我已经阅读文档,指出'鉴于枚举的types,System.Enum的GetValues()方法将返回给定枚举的基本types的数组(即int,byte等)

不过,我一直在使用GetValues方法,所有我一直得到的是一个枚举types的数组。 我错过了什么?

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

foreach(var值在Enum.GetValues(typeof(Response))){var type = value.GetType(); //types总是typesEnum不是枚举基types}

谢谢

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

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

因为GetValues不是强types的

编辑:只是重新阅读答案。 您需要明确地将每个枚举值转换为基础types,因为GetValues返回实际枚举types的数组而不是基本types。 Enum.GetUnderlyingType可以帮助这个。

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

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

你可以请参考你提到的文件。 Enum.GetValues上的MSDN文档没有提到类似的东西(从该页面引用):

返回值

types:System.Array

枚举types中的常量值的数组。 数组的元素按枚举常量的二进制值sorting。

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

 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>(); 

正如Roger在评论中提到的那样,如果有一个Enum.GetValues<MyEnum>()generics实现,那将是很好的,但是没有。

这个问题也让我恼火,所以我在C ++ / CLI中创build了一个库 ,它具有Enum类中所有静态方法的generics实现(以及一系列用于枚举的通用方法) 。

该库是用C ++ / CLI编写的,因为C#不支持通过System.Enum约束generics。 C ++ / CLI(和CLR)支持通过System.Enum 进行约束,而C#/ VB.NET没有理解对有这个约束的方法的调用。

在你的例子的情况下,你会使用Enums.GetValues<MyEnumType>() ,这将会给你一个MyEnumType的数组,而不需要MyEnumType转换。 尽pipeC#和VB.Net不支持定义一个枚举约束,但是它们在使用具有这种约束的方法/类时是没有问题的,而编译器/编译器可以很好地处理它。

类似于乔尔的答案,但做了一个稍微不同的方式:

 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();