C#枚举Enum.TryParse使用细节

我们知道,枚举(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获取枚举类型的所有名称并将其转换为列表,也可以方便地检查某个字符串是否在枚举名称列表中。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值