using System.Collections.Generic;
public static void Main()
Console.WriteLine(M1(typeof(Derived1), typeof(List<>)));
Console.WriteLine(M2(typeof(Derived1), typeof(List<>)));
public class Derived1 : List<int> {}
public class Derived2 : List<int> {}
public static Type M1(Type type, Type baseType) {
Type baseTypeToCheck = type;
while (baseTypeToCheck != null && baseTypeToCheck != typeof(object))
if (baseTypeToCheck.IsGenericType)
Type genericTypeToCheck = baseTypeToCheck.GetGenericTypeDefinition();
if (genericTypeToCheck == baseType)
baseTypeToCheck = baseTypeToCheck.BaseType!;
public static Type M2(Type type, Type baseType) {
Type ienumerableType = type.GetInterface("System.Collections.Generic.IEnumerable`1");
if (ienumerableType == null)
Type closedType = baseType.MakeGenericType(ienumerableType.GetGenericArguments()[0]);
return closedType.IsAssignableFrom(type) ? closedType : null;