C#枚举值与字符串相互获取

本文介绍了一个使用 C# 进行枚举类型操作的例子,包括如何获取枚举的名称、数量以及如何通过字符串解析枚举值。示例中定义了一个 Week 枚举类型,并演示了如何遍历枚举成员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

namespace 枚举
{
    class Program
    {
        static void Main(string[] args)
        {
            //<Enum.GetNames(typeof(Week)).Length 获取枚举的总个数
            //
            for (int i = 0; i < Enum.GetNames(typeof(Week)).Length; i++)
            {
                //用枚举只获取字符串
                Console.WriteLine($"{i}={Enum.GetName(typeof(Week), i)}");
                //输出:
                /*
                0=星期天
                1=星期一
                .
                .
                .
                */
            }
            //用字符串获取枚举值
            Week week = (Week)Enum.Parse(typeof(Week), "星期天");
            Console.WriteLine((int)week);
            //输出:
            /*
             0
             */
        }
        public enum Week
        {
            星期天 = 0,
            星期一 = 1,
            星期二 = 2,
            星期三 = 3,
            星期四 = 4,
            星期五 = 5,
            星期六 = 6
        }
    }
}

 

<think>我们被要求根据字符串名称获取枚举。在C#中,这通常通过`Enum.Parse`或`Enum.TryParse`方法实现。引用[1]中提供了使用`Enum.Parse`的示例:`TimeOfDaytime2=(TimeOfDay)Enum.Parse(typeof(TimeOfDay),"afternoon",true);`这里,第一个参数是枚举类型,第二个参数是要转换的字符串,第三个参数表示是否忽略大小写(true表示忽略)。此外,我们还可以使用`Enum.TryParse`,它更安全,因为如果转换失败不会抛出异常,而是返回一个布尔表示是否成功。因此,我们可以提供两种方法:1.使用`Enum.Parse`:如果字符串是有效的枚举名称,则转换;否则抛出异常。2.使用`Enum.TryParse`:安全地尝试转换,避免异常。另外,引用[4]中提到了枚举可以带有属性(如Description、DisplayName),但用户问题只是根据字符串名称(即枚举成员的名称)来获取枚举,所以不需要考虑属性。步骤:1.确定枚举类型。2.使用字符串枚举类型进行转换。示例代码:假设我们有枚举:```csharppublicenumTimeOfDay{Morning,Afternoon,Evening}```方法1:使用Enum.Parse```csharpstringenumName="Afternoon";TimeOfDaytime=(TimeOfDay)Enum.Parse(typeof(TimeOfDay),enumName,true);//忽略大小写```方法2:使用Enum.TryParse```csharpstringenumName="Afternoon";TimeOfDaytime;if(Enum.TryParse<TimeOfDay>(enumName,true,outtime))//忽略大小写{//转换成功}else{//转换失败的处理}```注意:在C#7.0及以上版本,我们可以使用内联声明:```csharpif(Enum.TryParse<TimeOfDay>(enumName,true,outvartime)){//使用time}```因此,回答将围绕这两种方法展开。同时,用户提供的引用[1]中还有将枚举转换为名称的方法,但用户的问题是将字符串转换为枚举,所以我们只关注转换部分。最后,我们生成相关问题。</think>### C#字符串转换为枚举(根据名称) 在 C# 中,将字符串名称转换为枚举主要通过 `Enum.Parse` 和 `Enum.TryParse` 方法实现。以下是完整实现方法: #### 1. 基本转换方法(使用 Enum.Parse) ```csharp // 定义枚举 public enum TimeOfDay { Morning, Afternoon, Evening } // 字符串枚举 string name = "Afternoon"; TimeOfDay enumValue = (TimeOfDay)Enum.Parse(typeof(TimeOfDay), name); Console.WriteLine(enumValue); // 输出: Afternoon Console.WriteLine((int)enumValue); // 输出: 1 ``` #### 2. 安全转换方法(使用 Enum.TryParse) ```csharp string input = "evening"; TimeOfDay result; // 尝试转换(忽略大小写) if (Enum.TryParse(input, true, out result)) { Console.WriteLine($"转换成功: {result} ({(int)result})"); } else { Console.WriteLine("无效的枚举名称"); } ``` #### 3. 处理带特性的枚举枚举成员使用特性(如 `Description`)时,可通过反射获取: ```csharp public enum Status { [Description("等待处理")] Pending, [Description("处理中")] Processing, [Description("已完成")] Completed } // 通过特性获取枚举 string description = "处理中"; var enumValue = Enum.GetValues(typeof(Status)) .Cast<Status>() .FirstOrDefault(e => e.GetType() .GetField(e.ToString()) .GetCustomAttribute<DescriptionAttribute>()? .Description == description); Console.WriteLine(enumValue); // 输出: Processing ``` #### 4. 实用扩展方法 创建可重用的转换扩展: ```csharp public static class EnumExtensions { public static T ToEnum<T>(this string value, bool ignoreCase = true) where T : struct, Enum { if (Enum.TryParse(value, ignoreCase, out T result)) return result; throw new ArgumentException($"无效的 {typeof(T).Name} : {value}"); } } // 使用示例 string input = "Morning"; TimeOfDay time = input.ToEnum<TimeOfDay>(); ``` #### 关键要点 1. **大小写处理**: - `Enum.Parse` 默认区分大小写 - 设置 `ignoreCase: true` 忽略大小写 2. **错误处理**: - `Enum.Parse` 在无效名称时抛出 `ArgumentException` - `Enum.TryParse` 返回布尔避免异常 3. **性能建议**: - 频繁转换时缓存 `Type` 对象:`var type = typeof(TimeOfDay);` - 避免在循环中使用反射获取特性 4. **特殊场景**: ```csharp // 数字字符串转换 string numStr = "2"; TimeOfDay t = (TimeOfDay)Enum.Parse(typeof(TimeOfDay), numStr); // 获取所有名称 string[] allNames = Enum.GetNames(typeof(TimeOfDay)); ``` > 注意:当枚举来自不可信源(如用户输入)时,始终使用 `TryParse` 防止异常[^1]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值