2012-01-19 9 views

Odpowiedz

62

Można załadować wszystkie typy w zespole, a następnie wyliczyć je, aby zobaczyć, które z nich implementują typ obiektu. Powiedziałeś "obiekt", więc poniższy przykład kodu nie dotyczy interfejsów. Poza tym, ten przykładowy kod przeszukuje tylko ten sam zespół jak obiekt został ogłoszony w.

class A 
{} 
... 
typeof(A).Assembly.GetTypes().Where(type => type.IsSubclassOf(typeof(A))); 

Albo jak zasugerowano w komentarze, korzystać z tej próbki kodu do przeszukiwania wszystkich obciążonych zespołów.

var subclasses = 
from assembly in AppDomain.CurrentDomain.GetAssemblies() 
    from type in assembly.GetTypes() 
    where type.IsSubclassOf(typeof(A)) 
    select type 

Obie próbki kodu wymaga, aby dodać using System.Linq; interfejsy

+1

Aby zrobić to samo dla interfejsu zamiast obiektu/klasy, zmień gdzie linię do ' gdzie typeof (IMyInterface) .IsAssignableFrom (type) && type.IsClass' ([pytanie oryginalne] (http://stackoverflow.com/questions/26733/getting-all- typeses-that-implement-an-interface- with-c -sharp-3-0)). – jtpereyda

9

podklasy znaczy? Tak:

this.GetType().GetInterfaces() 

Podklasy oznaczające typy podstawowe? C# może mieć tylko jedną klasę podstawową, która oznacza wszystkie klasy dziedziczące po klasie? Tak:

EDIT: (vcsjones thanks)

foreach(var asm in AppDomain.CurrentDomain.GetAssemblies()) 
{ 
     foreach (var type in asm.GetTypes()) 
     { 
      if (type.BaseType == this.GetType()) 
       yield return type; 
     } 
} 

A to dla wszystkich załadowanych zespołów

+6

"Podklasy oznaczające interfejsy" - przepraszam, ale to nie ma sensu – BartoszKP

Powiązane problemy