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 instanciar mis tipos genéricos con un tipo y luego enumerar todos los tipos en el dominio de la aplicación, no veo los tipos cerrados recientemente creados.Enumere los tipos cerrados que el tiempo de ejecución ha creado a partir de los tipos genéricos abiertos
En el ejemplo siguiente, la salida es única:
Foo`1[T]
Busco tipo cerrado:
Foo`1[System.Int32]
¿Hay una manera de ver los tipos cerrados que tiene el tiempo de ejecución creado para mí basado en 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 sólo para satisfacer mi curiosidad.
Si entiendo correctamente, esta reflexión simplemente obtendrá los tipos definidos en los metadatos, que contienen en su caso solo la definición de tipo genérico. Dado que los tipos específicos se pueden construir de los tipos genéricos dinámicamente en tiempo de ejecución (de nuevo usando reflexión, pasando los argumentos genéricos), puede ver que no hay forma de ponerlos en los metadatos ... por lo tanto, algún otro mecanismo (no exploración de metadatos) tendría que usarse para encontrar los tipos específicos que se crearon. –
Ya veo. Eso explica por qué no puedo ver los tipos creados en tiempo de ejecución, no están en los metadatos que la reflexión está consultando. Me pregunto cuál sería el otro mecanismo. –
Hay un tipo privado dentro de mscorlib llamado TypeNameParser que tiene un método GetNames que devuelve una matriz de cadenas, pero cuando intento usarlo bajo reflexión recibo errores fatales que me recuerdan lo poco que sé de los objetos COM y la interoperabilidad, y que, en general, no debería perder el tiempo con tipos privados dentro de mscorlib :-P Todavía estoy buscando una solución elegante. –