HOWTO · Csharp

在 C# 中将 Int 转换为 Enum

学习使用强制转换或解析将整数转换为 C# 枚举,并检查结果是否为已声明的成员。

本页内容

在 C# 中将整数转换为枚举,可以将它强制转换为枚举类型:MyEnum value = (MyEnum)number;。枚举是一种值类型,包含命名常量和底层整数类型。强制转换会转换底层值,但不会检查该值是否对应已声明的常量。若只接受已命名的成员,请使用 Enum.IsDefined;若输入是文本,请使用 Enum.Parse 或 Enum.TryParse。

使用直接强制转换将整数转换为枚举

如果整数已经可用且其值由你控制,直接强制转换是最简单的选择。这个完整示例定义了一个底层类型默认为 int 的枚举,将值 2 强制转换为该枚举,并打印对应的成员名称。

using System;

public class Program
{
    public enum MyEnum { Zero = 0, One = 1, Two = 2 }

    public static void Main()
    {
        int number = 2;
        MyEnum value = (MyEnum)number;
        Console.WriteLine($"Converted Enum Value: {value}");
    }
}

强制转换不会验证结果。例如,将 7 强制转换后,会得到底层值为 7 的枚举值,即使 MyEnum 并未声明对应成员。如果应用程序只允许已声明的成员,请在强制转换前使用 Enum.IsDefined 检查。

使用 Enum.Parse 解析整数文本

Enum.Parse 接受字符串。如果整数以文本形式传入,请将该字符串传给此方法,再将其返回的 object 强制转换为目标枚举类型。示例解析的是数值字符串 "1"。

using System;

public class Program
{
    public enum MyEnum { Zero = 0, One = 1, Two = 2 }

    public static void Main()
    {
        string input = "1";
        MyEnum value = (MyEnum)Enum.Parse(typeof(MyEnum), input);
        Console.WriteLine($"Parsed Enum Value: {value}");
    }
}

解析数值字符串可能会得到底层数字没有对应已声明成员的枚举值。Enum.Parse 遇到格式错误的输入时也会抛出异常;如果希望在常见转换失败时不通过异常控制流程,请使用 Enum.TryParse。解析成功本身并不能证明该值是已声明的成员。

使用 Enum.IsDefined 检查枚举值是否已定义

使用 Enum.IsDefined 判断一个值是否对应已声明的枚举常量。此示例在强制转换前分别检查一个已声明和一个未声明的整数值。由于 MyEnum 的底层类型默认为 int,装箱后的 int 参数与该枚举的底层类型相符。

using System;

public class Program
{
    public enum MyEnum { Zero = 0, One = 1, Two = 2 }

    public static void Main()
    {
        int[] candidates = { 2, 7 };

        foreach (int number in candidates)
        {
            if (Enum.IsDefined(typeof(MyEnum), number))
            {
                MyEnum value = (MyEnum)number;
                Console.WriteLine($"{number}: defined as {value}");
            }
            else
            {
                Console.WriteLine($"{number}: not defined");
            }
        }
    }
}

Enum.IsDefined 检查的是是否存在完全匹配的已声明常量。对于各个值分别声明的简单枚举,这种检查很合适;对于 [Flags] 枚举,有效的标志组合可能没有作为单独成员声明,因此此检查可能会拒绝应用程序本来打算接受的组合。

使用 Enum.TryParse 解析整数文本

Enum.TryParse 会返回一个布尔值,表示文本能否转换为枚举类型,并通过 out 参数写入解析后的值。如果手头的数据是整数,请先将其转换为文本。示例还会单独检查成员资格,因为数值解析成功并不能证明该数字是已声明的成员。

using System;

public class Program
{
    public enum MyEnum { Zero = 0, One = 1, Two = 2 }

    public static void Main()
    {
        int number = 1;
        string input = number.ToString();

        if (Enum.TryParse<MyEnum>(input, out MyEnum value))
        {
            Console.WriteLine($"Parsed: {value}");
            Console.WriteLine($"Declared: {Enum.IsDefined(typeof(MyEnum), value)}");
        }
        else
        {
            Console.WriteLine("Could not parse the input.");
        }
    }
}

对于按名称表示的文本,Enum.TryParse 也接受已声明的成员名称,例如 "Two"。数值文本可能会解析为没有对应已声明成员的底层值,因此,如果应用程序要求值必须与某个已声明成员完全匹配,请保留 Enum.IsDefined 检查。只有在需要对名称进行不区分大小写的匹配时,才使用 ignoreCase 重载。

选择合适的转换方法

根据输入形式和所需的验证方式来选择:

  • 如果整数可信,且允许得到未声明的枚举值,请使用直接强制转换。
  • 如果输入是文本,且解析失败时应通过异常处理,请使用 Enum.Parse。
  • 如果输入是文本,且希望通过布尔结果判断转换是否成功,请使用 Enum.TryParse。
  • 如果只允许已声明的枚举常量,请在转换前或转换后使用 Enum.IsDefined。

这两种解析方法都不能保证数值对应某个已声明的常量。对于不可信或动态输入,如果应用程序只接受已声明的成员,请先尝试解析,再使用 Enum.IsDefined 检查。对于 [Flags] 枚举,应定义并应用允许的组合所需的验证规则,而不要只依赖 Enum.IsDefined。