Перечислить все классы Delphi, которые реализуют данный интерфейс?
-
19-09-2019 - |
Вопрос
С новым расширенным RTTI в Delphi 2010 может ли приложение Delphi (во время выполнения) создать список всех классов, которые реализуют данный интерфейс?
Решение
Технически да, при условии, что интерфейс имеет GUID, а классы, о которых вы заботитесь, находятся в разделах интерфейса units .
Модуль RTTI (пока) не имеет API для описания всех интерфейсов, реализуемых классом, но данные содержатся в type info .
Идентификатор GUID для типа интерфейса может быть получен из этого выражения:
GetTypeData(TypeInfo(ITheInterface))^.Guid
или:
ctx: TRttiContext;
// ...
(ctx.GetType(TypeInfo(ITheInterface)) as TRttiInterfaceType).GUID
Затем класс типа экземпляра может быть проверен с помощью TClass.GetInterfaceEntry(IID)
- если он возвращает значение, отличное от нуля, класс реализует интерфейс.
Все классы, объявленные в разделах интерфейса модулей, могут быть извлечены через TRttiContext.GetTypes
.
Написание фактического кода итерации и извлечения оставлено в качестве упражнения для читателя.