Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Lấy kiểu nền tảng của kiểu liệt kê (enum) hiện tại trong C#

Giới thiệu

Phương thức Type.GetEnumUnderlyingType() trả về kiểu dữ liệu nền tảng (underlying type) của enum (mặc định là int, có thể là byte, short, long, v.v.). Cần lấy Type của enum trước.

Ví dụ 1: Lấy underlying type của enum hợp lệ

using System;

public class Demo
{
    enum Vehicle { Car, Bus, Bike, Airplane }
    
    public static void Main()
    {
        try
        {
            Vehicle v = Vehicle.Bike;
            Type type = v.GetType();
            string[] str = type.GetEnumNames();
            Console.WriteLine("GetEnumNames() = " + string.Join(", ", str));
            
            Type type2 = type.GetEnumUnderlyingType();
            Console.Write("Enum Underlying type = " + type2);
            
            Console.WriteLine("\nListing constants ..");
            for (int i = 0; i < str.Length; i++)
                Console.Write("{0} ", str[i]);
        }
        catch (ArgumentException e)
        {
            Console.WriteLine("Not an enum!");
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}

Kết quả

GetEnumNames() = Car, Bus, Bike, Airplane
Enum Underlying type = System.Int32
Listing constants ..
Car Bus Bike Airplane

Ví dụ 2: Thử với kiểu không phải enum

using System;

public class Demo
{
    enum Vehicle { Car, Bus, Bike, Airplane }
    
    public static void Main()
    {
        try
        {
            Type type = typeof(int);
            string[] str = type.GetEnumNames();
            Console.WriteLine("GetEnumNames() = " + string.Join(", ", str));
            
            Type type2 = type.GetEnumUnderlyingType();
            Console.Write("Enum Underlying type = " + type2);
            
            Console.WriteLine("\nListing constants ..");
            for (int i = 0; i < str.Length; i++)
                Console.Write("{0} ", str[i]);
        }
        catch (ArgumentException e)
        {
            Console.WriteLine("Not an enum!");
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}

Kết quả

Not an enum!
System.ArgumentException

Các kiểu nền tảng hợp lệ cho enum

Kiểu nền tảng Kích thước Phạm vi
byte 8-bit 0 đến 255
sbyte 8-bit -128 đến 127
short 16-bit -32,768 đến 32,767
ushort 16-bit 0 đến 65,535
int (mặc định) 32-bit -2B đến 2B
uint 32-bit 0 đến 4B
long 64-bit -9E18 đến 9E18
ulong 64-bit 0 đến 1.8E19

Khai báo enum với kiểu nền tảng tùy chỉnh

enum SmallEnum : byte { A = 1, B = 2, C = 3 }
enum LargeEnum : long { X = 1000000, Y = 2000000 }

// Kiểm tra
Console.WriteLine(typeof(SmallEnum).GetEnumUnderlyingType()); // System.Byte
Console.WriteLine(typeof(LargeEnum).GetEnumUnderlyingType()); // System.Int64

Lưu ý

  • Gọi trên Type không phải enum → ném ArgumentException
  • Dùng type.IsEnum kiểm tra trước khi gọi
  • GetEnumNames() trả về tên các hằng số
  • GetEnumValues() trả về mảng giá trị