在C#编程中,枚举类型是一种常用的数据结构,用于定义一组命名的常量。实际开发中经常需要将外部输入的字符串转换为对应的枚举值,Enum.Parse函数是完成这个转换的核心工具,它可以将字符串映射到枚举类型的对应成员上。
Enum.Parse函数的基本介绍
Enum.Parse是System命名空间下Enum类的静态方法,主要用于将字符串表示的枚举名称或者数值转换为对应的枚举值。它有两个常用的重载形式,适配不同的使用场景。
重载形式一:指定枚举类型和字符串
该重载的形式为public static object Parse(Type enumType, string value),需要传入目标枚举的类型和待转换的字符串,返回的结果是object类型,需要强制转换为目标枚举类型。
重载形式二:支持忽略大小写
该重载的形式为public static object Parse(Type enumType, string value, bool ignoreCase),第三个参数ignoreCase表示是否忽略字符串的大小写,当传入true时,转换过程不区分字符串的大小写。
基础使用示例
首先定义一个测试用的枚举类型,后续的所有示例都基于这个枚举展开:
// 定义示例枚举
public enum UserRole
{
Admin, // 管理员
Editor, // 编辑
Viewer // 访客
}
常规字符串转换
当字符串和枚举成员的名称完全一致时,使用基础重载即可完成转换:
using System;
class Program
{
static void Main()
{
string roleStr = "Editor";
// 转换字符串为枚举,需要强制类型转换
UserRole role = (UserRole)Enum.Parse(typeof(UserRole), roleStr);
Console.WriteLine($"转换结果:{role},对应数值:{(int)role}");
// 输出:转换结果:Editor,对应数值:1
}
}
忽略大小写转换
如果字符串的大小写和枚举成员不一致,使用忽略大小写的重载可以避免转换失败:
using System;
class Program
{
static void Main()
{
string roleStr = "admin";
// 第三个参数传true,忽略大小写
UserRole role = (UserRole)Enum.Parse(typeof(UserRole), roleStr, true);
Console.WriteLine($"转换结果:{role}");
// 输出:转换结果:Admin
}
}
数值字符串转换
Enum.Parse也支持将枚举成员对应的数值字符串转换为枚举值,不需要和成员名称完全一致:
using System;
class Program
{
static void Main()
{
string numStr = "2";
UserRole role = (UserRole)Enum.Parse(typeof(UserRole), numStr);
Console.WriteLine($"转换结果:{role}");
// 输出:转换结果:Viewer
}
}
转换失败的处理方式
如果传入的字符串既不是枚举成员的名称,也不是对应的数值字符串,Enum.Parse会直接抛出ArgumentException异常,实际开发中需要做好异常处理或者提前校验。
异常捕获处理
使用try-catch块捕获转换过程中的异常,避免程序崩溃:
using System;
class Program
{
static void Main()
{
string wrongStr = "Guest";
try
{
UserRole role = (UserRole)Enum.Parse(typeof(UserRole), wrongStr);
Console.WriteLine($"转换结果:{role}");
}
catch (ArgumentException ex)
{
Console.WriteLine($"转换失败:{ex.Message}");
// 输出:转换失败:请求的值"Guest"未找到。
}
}
}
提前校验转换合法性
可以使用Enum.IsDefined方法提前判断字符串是否是合法的枚举值,再执行转换:
using System;
class Program
{
static void Main()
{
string testStr = "Editor";
// 先判断是否是枚举的成员名称,注意这里不处理数值字符串和忽略大小写的场景
if (Enum.IsDefined(typeof(UserRole), testStr))
{
UserRole role = (UserRole)Enum.Parse(typeof(UserRole), testStr);
Console.WriteLine($"合法转换结果:{role}");
}
else
{
Console.WriteLine("字符串不是合法的枚举值");
}
}
}
使用注意事项
- Enum.Parse返回的是object类型,必须强制转换为目标枚举类型才能正常使用,否则会出现类型不匹配的错误。
- 如果不传入忽略大小写的参数,字符串的大小写必须和枚举成员的名称完全一致,否则会转换失败。
- 数值字符串转换时,即使数值没有对应的枚举成员,也不会抛出异常,会直接返回该数值对应的枚举值,比如传入"5"时,转换结果就是数值为5的枚举值,即使UserRole没有定义这个成员。
- 如果枚举类型定义了
Flags特性,Enum.Parse也支持组合枚举的字符串转换,字符串可以用逗号分隔多个枚举成员名称。
替代方案:Enum.TryParse
如果不想使用异常处理的方式来应对转换失败,也可以使用Enum.TryParse方法,它不会抛出异常,而是通过返回值表示转换是否成功:
using System;
class Program
{
static void Main()
{
string roleStr = "Viewer";
// TryParse返回bool表示是否转换成功,结果通过out参数返回
if (Enum.TryParse(roleStr, out UserRole role))
{
Console.WriteLine($"转换成功:{role}");
}
else
{
Console.WriteLine("转换失败");
}
}
}
C#Enum.Parse字符串转枚举枚举类型修改时间:2026-06-19 16:09:24