コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【C#】ジェネリッククラスの名前を名前空間と型引数付きで返す拡張メソッド

概要

var x = new List<int>();
var y = new Dictionary<int, string>();
print( x.GetType().ToString() );
// System.Collections.Generic.List`1[System.Int32]
print( y.GetType().ToString() );
// System.Collections.Generic.Dictionary`2[System.Int32,System.String]

型情報をType.GetType()で取得して Type.ToString()を参照することで
名前空間付きで型の名前を表す文字列が取得可能ですが、
ジェネリッククラスの場合、型引数の数も文字列に含まれてしまいます

下記の拡張メソッドを使用することで
名前空間付きで何が型引数に指定されているのかを文字列で取得可能になります

using System;
using System.Linq;

public static class TypeExtensions
{
    public static string GetGenericNameWithNamespace( this Type self )
    {
        if ( !self.IsGenericType )
        {
            return self.ToString();
        }

        return string.Format(
            "{0}<{1}>", 
            self.ToString().Split( '`' )[0], 
            string.Join( ", " , self.GetGenericArguments().Select( c => c.GetGenericNameWithNamespace() ) ) );
    }
}
var x = new List<int>();
var y = new Dictionary<int, string>();
print( x.GetType().GetGenericNameWithNamespace() );
// System.Collections.Generic.List<System.Int32>
print( y.GetType().GetGenericNameWithNamespace() );
// System.Collections.Generic.Dictionary<System.Int32, System.String>

関連記事