如何使用增强的RTTI获取从给定类派生的类列表?

use*_*561 13 delphi 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;
Run Code Online (Sandbox Code Playgroud)

我不想实例化对象并使用'is'运算符,因为它不会及时执行.
作为当前的解决方法,我测试是否在RTTI上下文中找到了在TMyBaseForm中引入的方法:

if (rtyp.GetMethod('MyMethod') = nil) then Continue;
Run Code Online (Sandbox Code Playgroud)

但这不是一个干净的解决方案,因为如果在另一个类分支中引入了具有相同名称的方法,则会导致问题.

所以,我的问题:是否有一种常规方法来检测类类型是否来自另一个类类型?

谢谢,

RRU*_*RUZ 13

当你调用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;
Run Code Online (Sandbox Code Playgroud)