2012-01-19 18 views

risposta

62

È possibile caricare tutti i tipi nell'assieme e quindi enumerarli per vedere quali implementano il tipo di oggetto. Hai detto "oggetto" quindi l'esempio di codice seguente non è per le interfacce. Inoltre, questo esempio di codice cerca solo la stessa assemblea come l'oggetto è stata dichiarata in.

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

O come suggerito nei commenti, utilizzare questo esempio di codice per la ricerca in tutte le assemblee caricati.

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

Entrambi i campioni di codice richiedono di aggiungere using System.Linq; interfacce

+1

Per fare la stessa cosa per un'interfaccia invece di un oggetto/classe, modificare la riga dove ' dove typeof (IMyInterface) .IsAssignableFrom (type) && type.IsClass' ([domanda originale] (http://stackoverflow.com/questions/26733/getting-all-types-that-implement-an-interface-with-c -sharp-3-0)). – jtpereyda

9

sottoclassi significato? Sì:

this.GetType().GetInterfaces() 

Sottoclassi che significano tipi di base? Bene, C# può avere solo una classe base

Sottoclassi che significano tutte le classi che ereditano dalla tua classe? Sì:

EDIT: (vcsjones grazie)

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

E farlo per tutti gli assembly caricati

+6

"Sottoclassi con significato interfacce" - scusate, ma questo non ha senso – BartoszKP

Problemi correlati