IsGenericTypeあなたが与えた例のためにあなたが望むことをします:
using System;
using System.Collections.Generic;
using System.Reflection;
public class Test
{
    static void Main()
    {
        ShowType(typeof(int));
        ShowType(typeof(int?));
        ShowType(typeof(List<string>));
    }
    static void ShowType(Type type)
    {
        Console.WriteLine("{0} / {1}", type.IsGenericType, type.IsValueType);
    }
}
違いは、を使用IsConstructedGenericTypeするとfalseが返されるのtypeof(List<>)に対し、を使用するIsGenericTypeとtrueが返されることです。Type.ContainsGenericParameters.NET 2+でそれらを区別するために使用できます...それでも十分ではありませんが、病理学的な場合:
class Foo<T> : Dictionary<T, string> {}
考えてみてくださいtypeof(Foo<>).BaseType:
- IsConstructedGenericType:True(割り当てられたタイプパラメーターが1つ含まれています)
- IsGenericType:真
- ContainsGenericParameters:True(まだ割り当てられていない型パラメーターが1つ含まれています)
うまくいけば、これはあなたにとって問題にならないでしょう。