Énumérer toutes les classes Delphi qui mettent en œuvre une interface donnée?
-
19-09-2019 - |
Question
Avec la nouvelle extension RTTI Delphi 2010, une application peut Delphi (au moment de l'exécution) construire une liste de toutes les classes qui mettent en œuvre une interface donnée?
La solution
Techniquement oui, tant que l'interface a un GUID et les classes que vous aimez sont dans les sections d'interface d'unités.
L'unité RTTI ne fonctionne pas (encore) une API pour décrire toutes les interfaces qui une classe implémente, mais les données sont dans les informations de type.
peut être obtenu Le GUID pour un type d'interface de cette expression:
GetTypeData(TypeInfo(ITheInterface))^.Guid
ou
ctx: TRttiContext;
// ...
(ctx.GetType(TypeInfo(ITheInterface)) as TRttiInterfaceType).GUID
La classe du type d'instance peut alors être vérifiée à l'aide TClass.GetInterfaceEntry(IID)
- si elle renvoie une valeur non nulle, la classe implémente l'interface
Toutes les classes déclarées dans les sections d'interface d'unités peuvent être récupérées via TRttiContext.GetTypes
.
Ecriture du code d'itération réelle et l'extraction est laissé comme un exercice pour le lecteur.