在C#编程中,枚举是一种常用的数据类型,用于定义一组命名的常量,在很多业务场景中我们需要获取枚举包含的所有成员并进行遍历处理,Enum.GetValues就是实现这个需求的核心方法。

Enum.GetValues基础用法
Enum.GetValues是System命名空间下Enum类的静态方法,它的作用是返回一个指定枚举类型的所有枚举值的数组,数组元素的顺序和枚举声明时的顺序一致。基础的使用示例如下:
using System;
// 定义一个测试枚举
enum UserStatus
{
Normal = 0,
Frozen = 1,
Deleted = 2
}
class Program
{
static void Main()
{
// 调用Enum.GetValues获取UserStatus枚举的所有值
Array statusValues = Enum.GetValues(typeof(UserStatus));
// 遍历数组输出每个枚举值
foreach (UserStatus status in statusValues)
{
Console.WriteLine($"枚举值: {status}, 对应数值: {(int)status}");
}
}
}
上述代码运行后会依次输出Normal、Frozen、Deleted三个枚举值以及对应的整数数值,这是最基础的枚举遍历实现。
不同C#版本的写法差异
在C# 7.3及之前的版本中,Enum.GetValues的返回值是Array类型,需要手动进行类型转换才能方便使用。而从C# 8.0开始,引入了泛型重载的Enum.GetValues<TEnum>方法,使用起来更加便捷:
using System;
enum OrderType
{
Unpaid = 0,
Paid = 1,
Shipped = 2,
Completed = 3
}
class Program
{
static void Main()
{
// C# 8.0及以上版本的泛型写法
foreach (OrderType type in Enum.GetValues<OrderType>())
{
Console.WriteLine($"订单类型: {type}, 数值: {(int)type}");
}
}
}
泛型版本不需要再传入typeof参数,也不需要手动转换数组类型,代码更加简洁,也能减少类型转换可能出现的错误。
遍历时的常见注意事项
1. 枚举值可能不连续
枚举的成员数值可以不连续定义,Enum.GetValues会返回所有声明的枚举值,不会自动补全中间的数值:
using System;
enum ErrorCode
{
Success = 0,
ParamError = 100,
AuthError = 200,
SystemError = 500
}
class Program
{
static void Main()
{
foreach (ErrorCode code in Enum.GetValues(typeof(ErrorCode)))
{
Console.WriteLine($"错误码: {code}, 数值: {(int)code}");
}
}
}
上述代码只会输出0、100、200、500四个值,不会输出1到99之间的数值。
2. 位标志枚举的遍历
如果枚举标记了[Flags]特性,Enum.GetValues返回的是所有单个定义的枚举值,不会返回组合后的枚举值:
using System;
[Flags]
enum Permission
{
Read = 1,
Write = 2,
Execute = 4
}
class Program
{
static void Main()
{
foreach (Permission p in Enum.GetValues(typeof(Permission)))
{
Console.WriteLine(p);
}
}
}
上述代码只会输出Read、Write、Execute三个值,不会输出Read|Write这类组合值。
3. 空值判断
如果传入的枚举类型参数不正确,Enum.GetValues会抛出ArgumentNullException或者ArgumentException,实际使用中建议做好异常处理:
using System;
enum TestEnum
{
A = 0,
B = 1
}
class Program
{
static void Main()
{
try
{
// 错误示例:传入非枚举类型
Enum.GetValues(typeof(string));
}
catch (ArgumentException ex)
{
Console.WriteLine($"参数错误: {ex.Message}");
}
try
{
// 错误示例:传入null
Enum.GetValues(null);
}
catch (ArgumentNullException ex)
{
Console.WriteLine($"参数为空: {ex.Message}");
}
}
}
实际开发应用场景
枚举遍历最常见的场景是给前端下拉框填充选项,比如下面这个将枚举转换为键值对列表的示例:
using System;
using System.Collections.Generic;
enum Gender
{
Unknown = 0,
Male = 1,
Female = 2
}
class Program
{
static void Main()
{
List<KeyValuePair<int, string>> genderOptions = new List<KeyValuePair<int, string>>();
foreach (Gender g in Enum.GetValues(typeof(Gender)))
{
genderOptions.Add(new KeyValuePair<int, string>((int)g, g.ToString()));
}
// 遍历输出下拉框选项
foreach (var option in genderOptions)
{
Console.WriteLine($"值: {option.Key}, 显示文本: {option.Value}");
}
}
}
通过这种方式可以快速生成前端需要的枚举选项数据,不需要手动逐个添加,减少重复代码和出错概率。
C#Enum_GetValues遍历枚举枚举遍历修改时间:2026-07-12 16:33:25