我们知道,枚举(enum)的基础类型默认是int。当你定义一个枚举类型时,未显式指定默认值的枚举成员的值会从0开始递增。例如:
enum Days
{
Sunday, // 0
Monday, // 1
Tuesday, // 2
Wednesday, // 3
Thursday, // 4
Friday, // 5
Saturday // 6
}
完整代码
首先给出一段完整代码:
using System;
enum Color
{
Default,
Red,
Black,
Yellow,
Green
}
class Program
{
static void Main()
{
// 使用 Enum.TryParse 尝试解析字符串为枚举值
var isEnumParsed = Enum.TryParse("0", true, out Color parsedEnumValue);
Console.WriteLine(isEnumParsed ? parsedEnumValue.ToString() : "Not Parsed"); // Red
// 尝试解析不存在的枚举值
Color col;
try
{
col = (Color)Enum.Parse(typeof(Color), "Blue"); // System.ArgumentException:“Requested value 'Blue' was not found.”
}
catch (Exception ex)
{
// 转换失败
Console.WriteLine("FAILED");
Console.WriteLine(ex.Message);
// 设置默认值
col = Color.Default;
}
// 转换成功
if (col == Color.Red)
{
//Todo
}
// 尝试解析负整数值
var isEnumValidValue = (Enum.TryParse("-1", true, out Color parsedEnumValidValue));
Console.WriteLine(isEnumValidValue ? parsedEnumValidValue.ToString() : "Not Parsed"); // -1
// 使用 Enum.IsDefined 检查值是否在枚举中定义
var isEnumIsDefinedValue = (Enum.TryParse("-1", true, out Color parsedEnumIsDefinedValue) && Enum.IsDefined(typeof(Color), parsedEnumIsDefinedValue));
Console.WriteLine(isEnumIsDefinedValue ? parsedEnumIsDefinedValue.ToString() : "Not Parsed"); // Not Parsed
// 使用 Enum.GetNames 获取枚举的所有名称
var ColorsList = Enum.GetNames(typeof(Color)).ToList();
Console.WriteLine(ColorsList.Contains("Red") ? "Red" : "Not Parsed"); // Red
Console.WriteLine(ColorsList.Contains("Blue") ? "Blue" : "Not Parsed"); // Not Parsed
Console.WriteLine(ColorsList.Contains("-1") ? "-1" : "Not Parsed"); // Not Parsed
}
}
代码运行结果:
Default
FAILED
Requested value 'Blue' was not found.
-1
Not Parsed
Red
Not Parsed
Not Parsed
Enum.TryParse举例
下面这个例子中,传递了一个字符串“0”,并期望将其解析为一个枚举值。参数中true表示忽略大小写进行解析,如果解析成功,输出相应的枚举名称。由于“0”对应Color.Red,因此Enum.TryParse会成功
var isEnumParsed = Enum.TryParse("0", true, out Color parsedEnumValue);
Console.WriteLine(isEnumParsed ? parsedEnumValue.ToString() : "Not Parsed"); // Red
再看解析枚举定义中不存在的例子。显然“Blue”不在枚举中定义中,转换失败,会抛出一个异常
Color col;
try
{
col = (Color)Enum.Parse(typeof(Color), "Blue"); // System.ArgumentException:“Requested value 'Blue' was not found.”
}
catch (Exception ex)
{
// 转换失败
Console.WriteLine("FAILED");
Console.WriteLine(ex.Message);
// 设置默认值
col = Color.Default;
}
// 转换成功
if (col == Color.Red)
{
//Todo
}
下面的一个例子,虽然“-1”不在Color枚举中定义,但它仍然是一个有效的int值
var isEnumValidValue = (Enum.TryParse("-1", true, out Color parsedEnumValidValue));
Console.WriteLine(isEnumValidValue ? parsedEnumValidValue.ToString() : "Not Parsed"); // -1
引入Enum.IsDefined
为了不去解析枚举中不存在的整数值或其名称字符串可以使用Enum.IsDefined方法
var isEnumIsDefinedValue = (Enum.TryParse("-1", true, out Color parsedEnumIsDefinedValue) && Enum.IsDefined(typeof(Color), parsedEnumIsDefinedValue));
Console.WriteLine(isEnumIsDefinedValue ? parsedEnumIsDefinedValue.ToString() : "Not Parsed"); // Not Parsed
Enum.GetNames
通过使用Enum.GetNames方法从枚举声明中获取所有名称来检查某个字符串是否在枚举名称列表中
var ColorsList = Enum.GetNames(typeof(Color)).ToList();
Console.WriteLine(ColorsList.Contains("Red") ? "Red" : "Not Parsed"); // Red
Console.WriteLine(ColorsList.Contains("Blue") ? "Blue" : "Not Parsed"); // Not Parsed
Console.WriteLine(ColorsList.Contains("-1") ? "-1" : "Not Parsed"); // Not Parsed
应用场景
配置文件的解析
在配置文件中,某些设置可能以字符串形式存储。通过Enum.TryParse,可以将这些字符串转换为枚举值,便于程序逻辑处理。
using System;
enum LogLevel
{
Trace,
Debug,
Info,
Warn,
Error,
Fatal
}
class Program
{
static void Main()
{
string configLogLevel = "Debug";
if (Enum.TryParse(configLogLevel, true, out LogLevel logLevel))
{
Console.WriteLine($"Log level set to {logLevel}"); // Log level set to Debug
}
else
{
Console.WriteLine("Invalid log level in configuration");
}
}
}
用户输入的处理
在命令行应用中,用户可能会输入枚举值的字符串表示。通过Enum.TryParse可以将这些输入转换为枚举值,并进行相应的处理。
using System;
enum Command
{
Start,
Stop,
Pause,
Resume
}
class Program
{
static void Main()
{
Console.WriteLine("Enter command: ");
string userInput = Console.ReadLine();
if (Enum.TryParse(userInput, true, out Command command))
{
Console.WriteLine($"Executing {command} command");
// 执行相应的命令逻辑
}
else
{
Console.WriteLine("Invalid command");
}
}
}
Enter command:
Start
Executing Start command
总结
- Enum.TryParse方法不仅可以解析枚举名称,还可以解析整数值。这些整数值可能不在枚举定义的范围内,但仍然是枚举基础类型的有效值。这意味着如果你传递一个整数字符串(例如“-1”),它会尝试将其转换为枚举的基础类型(通常是int),并返回相应的枚举值。
- Enum.IsDefined用来判断给定的整数值或其名称字符串是否存在于指定的枚举中。
- 通过结合使用Enum.TryParse和Enum.IsDefined,可以确保解析后的值不仅是有效的枚举基础类型值,而且是枚举类型中定义的合法值。这样可以防止解析出不在枚举定义范围内的值。
- 通过使用Enum.GetNames获取枚举类型的所有名称并将其转换为列表,也可以方便地检查某个字符串是否在枚举名称列表中。