C#怎么遍历枚举 C# Enum.GetValues遍历方法

来源:IPIPP.com作者:高宇头衔:草根站长
导读:本期聚焦于小伙伴创作的《C#怎么遍历枚举 C# Enum.GetValues遍历方法》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#怎么遍历枚举 C# Enum.GetValues遍历方法》有用,将其分享出去将是对创作者最好的鼓励。

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

C#怎么遍历枚举 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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。