Перечислить все классы Delphi, которые реализуют данный интерфейс? - PullRequest
8 голосов
/ 07 февраля 2010

С новым расширенным RTTI в Delphi 2010 может ли приложение Delphi (во время выполнения) создать список всех классов, которые реализуют данный интерфейс?

1 Ответ

20 голосов
/ 07 февраля 2010

Технически да, если у интерфейса есть GUID, а классы, которые вам нужны, находятся в разделах интерфейса модулей.

Модуль RTTI (пока) не имеет API для описания всех интерфейсов, которые реализует класс, но данные находятся в информации о типе.

GUID для типа интерфейса можно получить из этого выражения:

GetTypeData(TypeInfo(ITheInterface))^.Guid

или

ctx: TRttiContext;
// ...
(ctx.GetType(TypeInfo(ITheInterface)) as TRttiInterfaceType).GUID

Затем можно проверить класс типа экземпляра с помощью TClass.GetInterfaceEntry(IID) - если он возвращает не ноль, класс реализует интерфейс.

Все классы, объявленные в интерфейсных секциях модулей, можно получить с помощью TRttiContext.GetTypes.

Написание фактического кода итерации и извлечения оставлено читателю в качестве упражнения.

...