はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】ジェネリック型を構築するジェネリック型定義を取得・判定する(GetGenericTypeDefinition(), IsGenericTypeDefinition)

はじめに

今回はジェネリック型を構築するジェネリック型定義を取得・判定する方法について紹介したいと思います。

System.Collections.Generic.Dictionary`2[System.String,System.Int32]
Dictionary<string, int>
↓
// ジェネリック型定義
System.Collections.Generic.Dictionary`2[TKey,TValue]
Dictionary<TKey, TValue>

概要

元になるジェネリック型定義を取得するにはType.GetGenericTypeDefinition()を用い、ジェネリック型定義かどうか調べるにはType.IsGenericTypeDefinitionを利用します。

public virtual Type GetGenericTypeDefinition ();

現在のジェネリック型を構築する元になるジェネリック型定義を表す Type オブジェクトを返します。

Type.GetGenericTypeDefinition メソッド (System) | Microsoft Learn

public virtual bool IsGenericTypeDefinition { get; }

現在の Type が、他のジェネリック型を構築できるジェネリック型の定義を表しているかどうかを示す値を取得します。

Type.IsGenericTypeDefinition プロパティ (System) | Microsoft Learn

やり方

Console.WriteLine(typeof(Dictionary<string, int>));                                                      // System.Collections.Generic.Dictionary`2[System.String,System.Int32]
Console.WriteLine(typeof(Dictionary<string, int>).IsGenericTypeDefinition);                              // False
Console.WriteLine(typeof(Dictionary<string, int>).GetGenericTypeDefinition());                           // System.Collections.Generic.Dictionary`2[TKey,TValue]
Console.WriteLine(typeof(Dictionary<string, int>).GetGenericTypeDefinition().IsGenericTypeDefinition);   // True

またジェネリック型定義は以下のように取得することもできます。

Console.WriteLine(typeof(Dictionary<,>));    // System.Collections.Generic.Dictionary`2[TKey,TValue]