Подтвердить что ты не робот

Как получить список классов, полученных из данного класса, с расширенным RTTI?

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

Я использую Delphi 2010 и расширенный RTTI для просмотра типов

Мой текущий код:

rc := TRTTIContext.Create;
rtyps := rc.GetTypes;
for rtyp in rtyps do
begin
  if not(rtyp.IsInstance) then Continue;

  // Now I need to check if rtyp.AsInstance.MetaclassType is derived from TMyBaseForm
end;

Я не хочу инициализировать объект и использовать оператор 'is', поскольку он не будет выполняться своевременно.
В качестве текущего обходного пути я проверяю, был найден метод, введенный в TMyBaseForm, в контексте RTTI:

if (rtyp.GetMethod('MyMethod') = nil) then Continue;

но это не чистое решение, так как это может привести к выпуску, если метод с тем же именем был введен в другую ветку класса.

Итак, мой вопрос: существует ли регулярный способ определения того, является ли тип класса производным от другого типа класса?

Спасибо,

4b9b3361

Ответ 1

Когда вы вызываете AsInstance возвращает TRttiInstanceType, оттуда вы должны получить доступ к MetaclassType, которое является ссылкой TClass на отраженный тип, и, наконец, используя TClass, вы можете вызвать InheritsFrom

for rtyp in rtyps do
if (rtyp.TypeKind=tkClass) and rtyp.IsInstance and rtyp.AsInstance.MetaclassType.InheritsFrom(TMyBaseForm) then
begin

  // do something
end;