如何在C#中枚举所有Enum值:新手完整解析

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么“How can I enumerate an enum?”这个问题如此流行?

\n\n

如果你曾经用C#编程并遇到过枚举(enum),那么你很可能问过自己:“我该如何获取这个enum的所有值?”这个问题在Stack Overflow上非常热门,获得了数千次浏览。这并不奇怪:枚举enum是一个看似简单但如果不了解正确语法,即使是经验丰富的开发者也可能会陷入困境的任务。

\n\n

在本文中,我们将详细讲解如何正确在C#中枚举所有enum值,展示可以直接复制到项目中的工作代码示例,并介绍一些陷阱。让我们开始吧!

\n\n

C#中的enum是什么?简要回顾

\n\n

Enum(枚举)是一种数据类型,允许你定义一组命名常量。例如,星期几、订单状态或错误类型。在C#中,enum声明如下:

\n\n
public enum DayOfWeek\n{\n    Monday,\n    Tuesday,\n    Wednesday,\n    Thursday,\n    Friday,\n    Saturday,\n    Sunday\n}
\n\n

默认情况下,每个元素都被分配一个整数值(从0开始)。但经常需要遍历enum的所有元素——例如,将它们显示在下拉列表中、创建数组或检查某个值是否存在。

\n\n

如何枚举所有enum值:基本方法

\n\n

最流行且最简单的方法是使用静态方法Enum.GetValues()。它返回指定枚举的所有值的数组。具体用法如下:

\n\n
using System;\n\npublic class Program\n{\n    public enum Status\n    {\n        New,\n        InProgress,\n        Completed,\n        Cancelled\n    }\n\n    public static void Main()\n    {\n        // 获取enum的所有值\n        Status[] allStatuses = (Status[])Enum.GetValues(typeof(Status));\n\n        // 使用foreach遍历它们\n        foreach (Status status in allStatuses)\n        {\n            Console.WriteLine(status);\n        }\n    }\n}
\n\n

执行结果:

\n
New\nInProgress\nCompleted\nCancelled
\n\n

请注意:我们显式地将结果转换为Status[]数组,因为Enum.GetValues()返回的是Array(非泛型)。

\n\n

替代方法:Enum.GetNames()

\n\n

如果你需要的不是值本身,而是它们的字符串名称,请使用Enum.GetNames():

\n\n
string[] statusNames = Enum.GetNames(typeof(Status));\nforeach (string name in statusNames)\n{\n    Console.WriteLine(name);\n}
\n\n

结果相同,但元素类型是string而不是Status。这在处理UI或序列化时很方便。

\n\n

现代方法:泛型版本(C# 7.3+)

\n\n

从C# 7.3开始,我们有了更优雅的方式——Enum.GetValues<T>()。它返回具体类型的数组,无需强制转换:

\n\n
Status[] allStatuses = Enum.GetValues<Status>();\n\nforeach (Status status in allStatuses)\n{\n    Console.WriteLine($"ID: {(int)status}, Name: {status}");\n}
\n\n

这个方法更简洁,类型也更安全。如果你使用现代版本的C#(你应该使用!),我推荐使用它。

\n\n

实际案例:填充下拉列表

\n\n

假设你正在编写一个任务管理应用程序。你需要向用户显示一个可能状态的下拉菜单。以下是使用枚举enum的方法:

\n\n
using System;\nusing System.Collections.Generic;\n\npublic class TaskManager\n{\n    public enum TaskStatus\n    {\n        NotStarted,\n        InProgress,\n        WaitingForReview,\n        Done\n    }\n\n    publ                

博客

书籍推荐