Mam zestaw i chcę wyświetlić wszystkie klasy dziedziczące po określonej klasie/interfejsie.Lista wszystkich klas dziedziczących po określonej klasie/interfejsie
Jak to zrobić?
Mam zestaw i chcę wyświetlić wszystkie klasy dziedziczące po określonej klasie/interfejsie.Lista wszystkich klas dziedziczących po określonej klasie/interfejsie
Jak to zrobić?
Coś jak:
public static IEnumerable<Type> GetSubtypes(Assembly assembly, Type parent)
{
return assembly.GetTypes()
.Where(type => parent.IsAssignableFrom(type));
}
To dobrze dla prostego przypadku, ale staje się coraz bardziej „ciekawe” (czytaj: trudne), gdy chcesz znaleźć „wszystkie typy wykonawcze IEnumerable<T>
dla każdego T
” itp
(Jak mówi Adam, z łatwością można to zrobić metodą rozszerzającą. Zależy to od tego, czy uważasz, że będziesz go używał ponownie czy nie - to problem, że metody rozszerzeń muszą znajdować się w niezagrożonej klasie statycznej ...)
public static IEnumerable<Type> GetTypesThatInheritFrom<T>(this Assembly asm)
{
var types = from t in asm.GetTypes()
where typeof(T).IsAssignableFrom(t)
select t;
return types;
}
Skeeted jak zwykle. Równie dobrze może to być również metoda rozszerzenia. –
@Jon, Jak byś zrobił, gdyby "chcesz znaleźć" wszystkie typy implementujące IEnumerable dla każdego T "itd."? Powiedziałeś również "to jest problem, że metody rozszerzenia muszą być w niezagnieżdżonej klasie statycznej". Czemu? Czy często korzystasz z klas zagnieżdżonych. Dzięki. –
@ Joan: Musiałbym wiedzieć, czy znajdował implementację * szczególnego * 'IEnumerable' lub * any * 'IEnumerable ' (tj. Czy podano T czy nie?) Jeśli chodzi o metody rozszerzenia ... I nie mają tendencji do pisania wielu klas statycznych najwyższego poziomu. Tworzenie jednego tylko dla metod rozszerzenia jest nieco przesadą. –