2011-12-08 10 views
12

Ho bisogno di ottenere un elenco di tipi di moduli, ma solo per tipi derivati ​​da un dato modulo di base.Come ottenere l'elenco delle classi derivate da una determinata classe, con RTTI avanzato?

Io uso Delphi 2010 e maggiore RTTI per sfogliare i tipi

Il mio codice attuale è:

rc := TRTTIContext.Create; 
rtyps := rc.GetTypes; 
for rtyp in rtyps do 
begin 
    if not(rtyp.IsInstance) then Continue; 

    // Now I need to check if rtyp.AsInstance.MetaclassType is derived from TMyBaseForm 
end; 

Non voglio instanciate un oggetto e utilizzare il 'è' operatore, in quanto non eseguirebbe in modo tempestivo.
Per aggirare il problema corrente, ho testare se un metodo, introdotto nel TMyBaseForm, è stato trovato nel contesto RTTI:

if (rtyp.GetMethod('MyMethod') = nil) then Continue; 

ma questo non è una soluzione pulita, in quanto può portare a problema se un metodo con il lo stesso nome è stato introdotto in un altro ramo di classe.

Quindi, la mia domanda: c'è un modo regolare per rilevare se un tipo di classe è derivata da un altro tipo di classe?

Grazie,

+2

Non so come implementarlo utilizzando RTTI, ma esiste la funzione [ClassParent] (http://docwiki.embarcadero.com/VCL/en/System.TObject.ClassParent). Restituisce il tipo di antenato immediato di una classe. O se hai bisogno di scoprire se un particolare tipo di classe o oggetto è un'istanza di una classe o uno dei suoi discendenti usa [InheritsFrom] (http://docwiki.embarcadero.com/VCL/en/System.TObject.InheritsFrom) funzione. – TLama

risposta

13

quando si chiama il AsInstance restituisce un TRttiInstanceType, da lì è necessario accedere alla wich MetaclassType proprietà è un TClass riferimento al tipo riflesso, infine, utilizzando il TClass è possibile chiamare la InheritsFrom funzione di

for rtyp in rtyps do 
if (rtyp.TypeKind=tkClass) and rtyp.IsInstance and rtyp.AsInstance.MetaclassType.InheritsFrom(TMyBaseForm) then 
begin 

    // do something 
end; 
+3

OMG, mi sono appena perso questo metodo da TClass ... solo una brutta giornata o il bisogno, per l'ora del caffè, immagino. Grazie per la tua risposta – user315561

+2

+1 @ user315561 il caffè funziona sempre! (: – ComputerSaysNo

+1

+1 per 'AsInstance' –

Problemi correlati