Utilizando IsAssignableFrom con tipos genéricos 'abiertos'

Utilizando la reflexión, intento encontrar el conjunto de tipos que heredan de una clase base dada. No tardé mucho en descubrir los tipos simples, pero estoy perplejo cuando se trata de genéricos.

Para este fragmento de código, el primer IsAssignableFrom devuelve verdadero, pero el segundo devuelve falso. Y, sin embargo, la tarea final se compila muy bien.

class class1 { }
class class2 : class1 { }
class generic1<T> { }
class generic2<T> : generic1<T> { }

class Program
{
    static void Main(string[] args)
    {
        Type c1 = typeof(class1);
        Type c2 = typeof(class2);
        Console.WriteLine("c1.IsAssignableFrom(c2): {0}", c1.IsAssignableFrom(c2));

        Type g1 = typeof(generic1<>);
        Type g2 = typeof(generic2<>);
        Console.WriteLine("g1.IsAssignableFrom(g2): {0}", g1.IsAssignableFrom(g2));

        generic1<class1> cc = new generic2<class1>();
    }
}

ntonces, ¿cómo puedo determinar en tiempo de ejecución si una definición de tipo genérico se deriva de otra?

Respuestas a la pregunta(5)

Su respuesta a la pregunta