Enumerare tutte le classi Delphi che implementano una determinata interfaccia?
-
19-09-2019 - |
Domanda
Con la nuova estesa RTTI in Delphi 2010 possono un'applicazione Delphi (in fase di esecuzione) costruire una lista di tutte le classi che implementano una data interfaccia?
Soluzione
Tecnicamente sì, a condizione che l'interfaccia ha un GUID e le classi che ti interessano sono in sezioni di interfaccia delle unità.
L'unità RTTI non ha (ancora) hanno un'API per descrivere tutte le interfacce che implementa una classe, ma i dati è in informazioni tipo.
GUID per un tipo di interfaccia può essere ottenuto da questa espressione:
GetTypeData(TypeInfo(ITheInterface))^.Guid
o
ctx: TRttiContext;
// ...
(ctx.GetType(TypeInfo(ITheInterface)) as TRttiInterfaceType).GUID
La classe del tipo di istanza possono poi essere verificata con TClass.GetInterfaceEntry(IID)
- se restituisce non-nil, la classe implementa l'interfaccia
Tutte le classi dichiarate nelle sezioni di interfaccia di unità possono essere recuperati tramite TRttiContext.GetTypes
.
Scrittura del codice iterazione e l'estrazione effettiva viene lasciata come esercizio per il lettore.