C#
 Computer >> コンピューター >  >> プログラミング >> C#

【C#】GetEnumUnderlyingType()で列挙型の基になる型を取得する方法

C#では、Type.GetEnumUnderlyingType()メソッドを使用することで、現在の列挙型(enum)が内部で使用している「基になる型(基底型)」を取得できます。基になる型を明示的に指定しない場合、列挙型の既定の基になる型はint型(System.Int32)になります。

この記事では、実際のサンプルコードと実行結果をもとに、GetEnumUnderlyingType()の使い方をわかりやすく解説します。

サンプルコード1:列挙型の基になる型を取得する

まずは、自作した列挙型の基になる型を取得する基本的な例を見てみましょう。

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("GetEnumName() が返す定数名 = " + str);
            Type type2 = type.GetEnumUnderlyingType();
            Console.Write("列挙型の基になる型 = "+type2);
            Console.WriteLine("\n定数の一覧 ..");
            for (int i = 0; i < str.Length; i++)
                Console.Write("{0} ", str[i]);
        }
        catch (ArgumentException e) {
            Console.WriteLine("列挙型ではありません!");
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

GetEnumName() が返す定数名 = System.String[]
列挙型の基になる型 = System.Int32
定数の一覧 ..
Car Bus Bike Airplane

このように、GetEnumUnderlyingType()を呼び出すことで、Vehicle列挙型の基になる型がSystem.Int32であることが確認できました。
また、GetEnumNames()は定数名を格納した文字列配列(string[])を返すため、そのまま連結して表示すると型名が表示される点にも注意してください。

サンプルコード2:列挙型以外を指定した場合

次に、int型など列挙型以外の型に対してこれらのメソッドを呼び出した場合の動作を確認してみましょう。

using System;
public class Demo {
    public static void Main() {
        try {
            Type type = typeof(int);
            string[] str = type.GetEnumNames();
            Console.WriteLine("GetEnumName() が返す定数名 = " + str);
            Type type2 = type.GetEnumUnderlyingType();
            Console.Write("列挙型の基になる型 = "+type2);
        }
        catch (ArgumentException e) {
            Console.WriteLine("列挙型ではありません!");
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

列挙型ではありません!
System.ArgumentException

int型などの列挙型以外の型に対してGetEnumNames()GetEnumUnderlyingType()を呼び出すと、ArgumentExceptionがスローされます。

安全に使うためのポイント

実際の開発では、try-catchによる例外処理に加えて、事前にType.IsEnumプロパティで対象の型が列挙型かどうかを判定しておくと、より安全で読みやすいコードになります。

  1. C#で現在のインスタンスの型を取得する方法(GetTypeメソッド)

    C#でオブジェクトの現在のインスタンスの型(実行時の型)を取得するには、GetType()メソッドを使用します。このメソッドはすべての型の基底クラスであるSystem.Objectに定義されており、呼び出し元インスタンスの正確な型をSystem.Typeオブジェクトとして返します。 GetType()メソッドの基本 GetType()はインスタンスに対して呼び出すことで、その実行時の型情報を取得できます。戻り値であるTypeオブジェクトをそのまま文字列連結して出力すると、「System.String」や「System.Int32」のような完全修飾型名が表示されます。 例1:string型のイン

  2. C#で列挙型(Enum)の型を取得する方法

    C#で列挙型(Enum)の型情報を取得するには、GetType()メソッドを使用します。この記事では、実際のコード例を通じて、列挙型の型名や基になる型(Underlying Type)の取得方法をわかりやすく解説します。 列挙型の準備 まず、複数の列挙型の値を格納した配列を用意します。ここでは、.NET標準ライブラリに含まれる ConsoleColor と DayOfWeek の2つの列挙型を使用します。 Enum[] values = { ConsoleColor.Blue, DayOfWeek.Sunday}; GetType()メソッドで型を取得する 列挙値の型を取得するには、各値