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);
}
