QA@IT

【自己解決】ジェネリックメソッドで型パラメーターで指定された型を判断したい

7641 PV

【自己解決いたしました】

C#のジェネリックメソッドで指定された型パラメーターで指定された型が何なのかを知るにはどうしたら良いでしょうか?

具体的にはT型がクラスなのか(クラス名ではなく)どうかを知りたいのですが、試しに下記の様な記述をしてもIsClassがFalseを返してしまいます。

public static void hoge<T>(List<T> list)
{
    T _class = default(T);

    Console.WriteLine(_class.GetType().GetTypeInfo().IsClass);
}

【解決・追記】

Tパラメータがstruct型に一時的にしていたことを失念していてなぜIsClassがFalseなのかと勘違いしていました。
(インスタンス化していない時点ですでにおかしい)
また、正しく書くなら下記の様なコードにすべきでした。

public static void hoge<T>(List<T> list)
{
    Type type = list.GetType().GetGenericArguments()[0];

    Console.WriteLine(type.GetType().IsClass);
}

【2018/04/06 追記】

↑で書くなら「Console.WriteLine(type.GetType().IsClass);」は「Console.WriteLine(type.IsClass);」ですね。

nachaさんの回答を受けて書き直し。

public static void hoge<T>(List<T> list)
{
    Type type = typeof(T);

    Console.WriteLine(type.IsClass);
}

これでこんなのでもnullでコケないと。

    List<int> test_A = new List<int>();
    List<string> test_B = new List<string>();
    List<class_a> test_C = new List<class_a>();
    test_C = null;

    Console.WriteLine("int:");
    hoge(test_A);
    Console.WriteLine("string:");
    hoge(test_B);
    Console.WriteLine("null:");
    hoge(test_C);
  • typeof(T)でいいと思いますよ。
    nullでも大丈夫ですし。
    -

回答

コメントにしてしまったので回答で書き直し(コメント消せませんが…)。

typeof(T)の方がいいと思います。
nullでも大丈夫ですし。

編集 履歴 (0)
  • ありがとうございます。追記しました。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。