Difference between Type.IsGenericTypeDefinition and Type.ContainsGenericParameters
.net, c#, generics, reflection
Solution
`Type.ContainsGenericParameters` is recursive:
var genericList = typeof(List<>);
var listOfSomeUnknownTypeOfList = genericList.MakeGenericType(genericList);
listOfSomeUnknownTypeOfList.IsGenericTypeDefinition; // => false
listOfSomeUnknownTypeOfList.ContainsGenericParameters; // => true
What happens here is that `listOfSomeUnknownTypeOfList` is not a generic type definition itself because its type parameter is known to be a `List<T>` for some T. However, since the type of `listOfSomeUnknownTypeOfList` is not exactly known (because its type argument is a type definition) `ContainsGenericParameters` is `true`.
Problem
The `System.Type` type contains the properties IsGenericTypeDefinition and ContainsGenericParameters. After reading the MSDN documentation I conclude that both properties exist to to check whether a type is an open or closed generic type. However, I fail to see what the difference is between the two, and when you want to use one over the other.