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,
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