public static void Main()
var genericTypes = Assembly.GetExecutingAssembly().GetTypes().Where(i => i.IsGenericType);
foreach(var item in genericTypes)
Console.WriteLine(item.IsGenericTypeDefinition);
var closed = typeof(Generic<ISpecial>);
Console.WriteLine(closed.IsGenericTypeDefinition);
item.MakeGenericType(typeof(ISpecial));
Console.WriteLine(item.IsGenericTypeDefinition);
foreach(var item in typeof(ConstrainedGeneric<>).GetGenericArguments())
foreach(var p in item.GetGenericParameterConstraints())
public interface ISpecial
public class ConstrainedGeneric<T> where T: ISpecial