2009-08-17 14 views

Odpowiedz

7

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 ...)

+0

Skeeted jak zwykle. Równie dobrze może to być również metoda rozszerzenia. –

+0

@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. –

+0

@ 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ą. –

3
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; 
}