返回类型

我已经阅读了文档,其中声明“给定枚举的类型,System 的 GetValue ()方法。枚举将返回一个给定枚举基类型的数组,即 int、 byte 等。

但是,我一直在使用 GetValue ()方法,所得到的只是一个 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
}
82391 次浏览

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

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

因为 GetValue 不是强类型的

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

你能参考一下你提到的文件吗。关于 Enum.GetValues的文件没有提到任何类似的内容(引自该页) :

返回值

类型: System.Array

控件的数组 枚举类型中常数的值。 对数组的元素进行排序 的二进制值 枚举常数。

如果你使用的是 NET 3.5(也就是 LINQ) ,你可以这样做:

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

就个人而言,我已经在我的 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>();

正如 收到在注释中提到的,如果有一个 Enum.GetValues<MyEnum>()通用实现就好了,但是没有。

这个问题也让我非常恼火,所以我用 C + +/CLI 创建了 图书馆,它具有 Enum类上所有静态方法的通用实现(以及许多其他处理枚举的通用方法)。

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

在您的示例中,您将使用 Enums.GetValues<MyEnumType>(),它将为您提供一个 MyEnumType数组,而不需要强制转换。尽管 C # 和 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();

如果您正在使用.NET5 + ,您现在可以使用 Enum.GetValues<TEnum>()

Https://learn.microsoft.com/en-us/dotnet/api/system.enum.getvalues?view=net-6.0#system-enum-getvalues-1