【C#】実行時にオブジェクトの型情報を取得するGetTypeメソッドの使い方

C#では、すべてのクラスの基底となる System.Object クラスに GetType() メソッドが定義されています。これを利用することで、プログラムの実行中にインスタンスの正確な型情報(System.Type オブジェクト)を取得できます。

これは「変数の型(静的な型)」ではなく、実際にメモリ上に割り当てられている「実体の型(動的な型)」を調べる際に使用され、リフレクションやログ出力、デバッグ時に役立ちます。

目次

GetTypeによる型情報の取得サンプル

以下のコードは、object 型の配列に格納された様々なデータの実体型を解析し、そのクラス名や名前空間を表示するサンプルです。

サンプルコード

using System;

public class Program
{
    public static void Main()
    {
        // 異なる型のインスタンスが混在するコレクション
        // 変数の型はすべて 'object' として扱われる
        var mixedData = new object[]
        {
            42,                         // System.Int32
            3.14159,                    // System.Double
            19800m,                     // System.Decimal
            "System Configuration",     // System.String
            DateTime.UtcNow,            // System.DateTime
            new Uri("https://example.com"), // System.Uri
            new CustomLogger()          // 独自クラス
        };

        Console.WriteLine($"{"Class Name",-15} | {"Namespace",-18} | FullName");
        Console.WriteLine(new string('-', 70));

        foreach (var obj in mixedData)
        {
            // GetType() を呼び出して、実行時の型情報(Typeオブジェクト)を取得
            Type t = obj.GetType();

            // Typeオブジェクトから各種プロパティを取得
            // Name: クラス名のみ
            // Namespace: 所属する名前空間
            // FullName: 名前空間を含む完全な名前
            Console.WriteLine($"{t.Name,-15} | {t.Namespace,-18} | {t.FullName}");
        }
    }
}

// 検証用の独自クラス
public class CustomLogger
{
}

実行結果

Class Name      | Namespace          | FullName
----------------------------------------------------------------------
Int32           | System             | System.Int32
Double          | System             | System.Double
Decimal         | System             | System.Decimal
String          | System             | System.String
DateTime        | System             | System.DateTime
Uri             | System             | System.Uri
CustomLogger    | Program+CustomLogger | Program+CustomLogger (※環境依存)

解説と注意点

取得できるプロパティの違い

System.Type オブジェクトからは、型に関する詳細な情報を取得できます。主なプロパティの違いは以下の通りです。

  • Name: クラスや構造体の名前のみ(例: Int32)。
  • Namespace: その型が所属している名前空間(例: System)。
  • FullName: 名前空間を含めた完全修飾名(例: System.Int32)。アセンブリ情報は含まれません。

実体の型が返る

変数が object 型やインターフェース型で宣言されていても、GetType() は常に「インスタンス生成時(new した時)の型」を返します。これにより、ポリモーフィズムが働いている状況でも、実際に扱っているオブジェクトの正体を知ることができます。

NullReferenceExceptionに注意

GetType() はインスタンスメソッドであるため、変数が null の場合に呼び出そうとすると NullReferenceException が発生します。null が入る可能性がある変数を扱う場合は、事前にnullチェックを行うか、C# 6.0以降の ?. 演算子を使用する必要があります(ただし GetType() は値型以外戻り値を持たないため、通常はif文でチェックします)。

object item = null;
// item.GetType(); // 例外発生

if (item != null)
{
    Console.WriteLine(item.GetType().Name);
}
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次