読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

.NET クラスライブラリ探訪-037 (System.Type)(04)(ジェネリックオブジェクトから型引数の型を取得する (System.Type, IsGenericType, GetGenericArguments, Generic, 型引数, 型パラメータ))


ジェネリックなオブジェクトから、オブジェクト作成時に指定された型引数を取得するには
System.Typeクラスの以下のメソッドを利用します。

public virtual Type[] GetGenericArguments()


GetGenericArgumentsメソッドは、System.Typeの配列を返します。
この配列がそのまま型引数の型となっています。


以下、サンプルです。

    #region TypeSamples-01
    public class TypeSamples01 : IExecutable
    {
        public void Execute()
        {
            List<int>               theList       = new List<int>{ 1, 2, 3, 4, 5 };
            Dictionary<int, string> theDictionary = new Dictionary<int, string>{ { 1, "hoge" }, { 2, "hehe" } };
            
            //
            // Genericなオブジェクトの型引数の型を取得するには、System.Typeクラスの以下のメソッドを利用する。
            //
            //     ・GetGenericArguments()
            //
            // GetGenericArgumentsメソッドは、System.Typeの配列を返すので、これを利用して型引数の型を判別する。
            //
            var genericArgTypes = theList.GetType().GetGenericArguments();
            Console.WriteLine("=============== List<int>の場合 =================");
            Console.WriteLine("型引数の数={0}, 型引数の型=({1})", genericArgTypes.Count(), string.Join(",", genericArgTypes.Select(item => item.Name)));
            
            genericArgTypes = theDictionary.GetType().GetGenericArguments();
            Console.WriteLine("=============== Dictionary<int, string>の場合 =================");
            Console.WriteLine("型引数の数={0}, 型引数の型=({1})", genericArgTypes.Count(), string.Join(",", genericArgTypes.Select(item => item.Name)));
        }
    }
    #endregion


実行すると以下のように出力されます。

  =============== Listの場合 =================
  型引数の数=1, 型引数の型=(Int32)
  =============== Dictionaryの場合 =================
  型引数の数=2, 型引数の型=(Int32,String)


尚、System.Typeクラスについては、以下の記事にてその他のメソッドを取り上げていますので
よろしければ、ご参考までに。

================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。