我已阅读文档,声明'给定枚举的类型,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
}
由于
答案 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();