Enumere todas as classes Delphi que implementam uma determinada interface?
-
19-09-2019 - |
Pergunta
Com o novo RTTI estendido em Delphi 2010, um aplicativo Delphi (em tempo de execução) pode criar uma lista de todas as classes que implementam uma determinada interface?
Solução
Tecnicamente, sim, desde que a interface tenha um GUID e as classes com as quais você se preocupa estão nas seções de interface das unidades.
A unidade RTTI ainda não possui uma API para descrever todas as interfaces que uma classe implementa, mas os dados estão nas informações do tipo.
O GUID para um tipo de interface pode ser obtido a partir desta expressão:
GetTypeData(TypeInfo(ITheInterface))^.Guid
ou:
ctx: TRttiContext;
// ...
(ctx.GetType(TypeInfo(ITheInterface)) as TRttiInterfaceType).GUID
A classe do tipo de instância pode ser verificada usando TClass.GetInterfaceEntry(IID)
- Se retornar não-nil, a classe implementa a interface.
Todas as classes declaradas em seções de interface das unidades podem ser recuperadas via TRttiContext.GetTypes
.
Escrever o código de iteração e extração real é deixado como um exercício para o leitor.