Listar los tipos cerrados que el tiempo de ejecución ha creado a partir de tipos genéricos abiertos

Cuando enumero todos los tipos en el dominio de aplicación actual, veo mis tipos genéricos con los marcadores de posición genéricos. Sin embargo, si realizo una instancia de mis tipos genéricos con un tipo y luego enumero todos los tipos en el dominio de aplicación, no veo los tipos cerrados recién creados.

En el siguiente ejemplo, la salida es solamente:

Foo`1[T]

Estoy buscando el tipo cerrado:

Foo`1[System.Int32]

¿Hay alguna manera de ver los tipos cerrados que el tiempo de ejecución ha creado para mí en función de mis tipos genéricos abiertos?

class Foo<T>
{
}

class Program
{
    static void Main(string[] args)
    {
        var tmp = new Foo<int>();
        ListTypes();
    }

    private static void ListTypes()
    {
        var types = from assembly in AppDomain.CurrentDomain.GetAssemblies()
                        from type in assembly.GetTypes()
                        where type.Name.Contains("Foo")
                        select type;

        foreach (var type in types)
            Console.WriteLine(type.ToString());
    }
}

También he intentado encontrar todos los tipos por el argumento genérico con la esperanza de descubrir el tipo cerrado.

class Foo<T>
{
}

class Bar
{
}

class Program
{
    static void Main(string[] args)
    {
        var tmp = new Foo<Bar>();
        ListTypes();
    }

    private static void ListTypes()
    {
        var types = from assembly in AppDomain.CurrentDomain.GetAssemblies()
                        from type in assembly.GetTypes()
                        where type.IsGenericType
                        && type.GetGenericArguments().Contains(typeof(Bar))
                        select type;

        foreach (var type in types)
            Console.WriteLine(type.ToString());
    }
}

Esto es solo para satisfacer mi curiosidad.

Respuestas a la pregunta(2)

Su respuesta a la pregunta