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