Po wyświetleniu wszystkich typów w bieżącym AppDomain widzę moje typy ogólne z ogólnymi symbolami zastępczymi. Jednakże, jeśli utworzę moje typy ogólne z typem, a następnie listę wszystkich typów w appDomain, nie widzę nowo utworzonych typów zamkniętych.Lista typów zamkniętych utworzonych przez środowisko wykonawcze z otwartych typów ogólnych
W poniższym przykładzie, wyjście jest tylko:
Foo`1[T]
szukam typu zamkniętego:
Foo`1[System.Int32]
Czy istnieje sposób, aby zobaczyć zamkniętych typów że Runtime stworzony dla mnie w oparciu o moje otwarte rodzaje generyczne?
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());
}
}
Próbowałem również znaleźć wszystkie typy za pomocą ogólnego argumentu w nadziei na odkrycie zamkniętego typu.
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());
}
}
To tylko po to, by zaspokoić moją ciekawość.
Jeśli dobrze rozumiem, ta refleksja po prostu otrzyma typy zdefiniowane w metadanych, które zawierają w tekście tylko rodzaj definicji rodzajowej. Ponieważ konkretne typy mogą być konstruowane z typów generycznych dynamicznie w czasie wykonywania (ponownie za pomocą refleksji, przekazując ogólne argumenty) - widać, że nie ma sposobu na umieszczenie ich w metadanych ... tak, jakiś inny mechanizm (nie eksploracja metadanych) musiałaby zostać wykorzystana do znalezienia określonych typów, które zostały utworzone. –
Rozumiem. To wyjaśnia, dlaczego nie widzę typów utworzonych w środowisku wykonawczym, nie ma ich w metadanych, które są przedmiotem refleksji. Zastanawiam się, jaki byłby ten inny mechanizm? –
Istnieje prywatny typ wewnątrz mscorlib o nazwie TypeNameParser, który ma metodę GetNames zwracającą tablicę ciągów znaków, ale gdy próbuję użyć jej w ramach refleksji, otrzymuję fatalne błędy przypominające mi, jak mało wiem o obiektach COM i współdziałaniu, i że generalnie nie powinienem mieszać się z prywatnymi typami wewnątrz mscorlib :-P Nadal jednak szukam eleganckiego rozwiązania. –