Quando elenco tutti i tipi nell'AppDomain corrente, vedo i miei tipi generici con i segnaposti generici. Tuttavia, se istanzio il mio tipo generico con un tipo e poi elencho tutti i tipi nell'appDomain, non vedo i tipi chiusi appena creati.Elenca i tipi chiusi che il runtime ha creato da tipi generici aperti
Nell'esempio sottostante, l'uscita è unica:
Foo`1[T]
Sto cercando tipo chiuso:
Foo`1[System.Int32]
C'è un modo per vedere i tipi di chiuse che il runtime ha creato per me in base ai miei tipi generici aperti?
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());
}
}
Ho anche provato a cercare tutti i tipi con l'argomento generico nella speranza di scoprire il tipo chiuso.
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());
}
}
Questo è solo per soddisfare la mia curiosità.
Se ho capito bene, questo riflesso otterrà semplicemente i tipi definiti nei metadati, che contiene nel tuo caso solo la definizione del tipo generico. Poiché i tipi specifici possono essere costruiti dai tipi generici dinamicamente in fase di esecuzione (sempre usando il reflection, passando gli argomenti generici) - puoi vedere che non c'è modo di metterli nei metadati ... quindi, qualche altro meccanismo (non esplorazione dei metadati) dovrebbe essere usato per trovare i tipi specifici che sono stati creati. –
Vedo. Questo spiega perché non riesco a vedere i tipi creati in fase di runtime, non sono nei metadati che il reflection sta interrogando. Mi chiedo quale sarebbe l'altro meccanismo? –
C'è un tipo privato dentro mscorlib chiamato TypeNameParser che ha un metodo GetNames che restituisce una matrice di stringhe, ma quando sto provando a usarlo sotto riflessione sto ricevendo errori fatali che mi ricordano quanto poco so di oggetti COM e interop, e che in genere non dovrei scherzare con i tipi privati all'interno di mscorlib :-P Comunque sto ancora cercando una soluzione elegante. –