using System; using System.Reflection; class Program { public static int Main () { Type type = typeof (Foo<>); Type [] gargs = type.GetGenericArguments (); if (gargs == null || gargs.Length != 1) { Console.WriteLine ("#1"); return 1; } Type garg = gargs [0]; Type [] csts = garg.GetGenericParameterConstraints (); if (garg.Name != "T") { Console.WriteLine ("#2: " + garg.Name); return 2; } if (garg.GenericParameterAttributes != (GenericParameterAttributes.DefaultConstructorConstraint | GenericParameterAttributes.NotNullableValueTypeConstraint)) { Console.WriteLine ("#3: " + garg.GenericParameterAttributes); return 3; } if (csts == null || csts.Length != 1) { Console.WriteLine ("#4"); return 4; } if (csts [0] != typeof (ValueType)) { Console.WriteLine ("#5: " + csts [0].FullName); return 5; } return 0; } } struct Foo where T : struct { }