在Delphi 10.3.3中使用RTTI收集类的所有后代

问题描述

对于基本TClass的所有后代,我都需要TClass。

我尝试了以下代码

type
  TClassList = TList<TClass>;

class procedure TClassUtility.collectDescendantClasses( ancestorClass_ : TClass; descendantClasses_ : TClassList );
var
  ctx: TRttiContext;
  list : TArray<TRttiType>;
  typ: TRttiType;
begin
  if ( descendantClasses_ <> NIL ) then
  begin
    ctx := TRttiContext.Create;
    try
      list := ctx.GetTypes;
      for typ in list do
      begin
        if ( typ.TypeKind = tkInstance ) then
          if ( ( ancestorClass_ = NIL ) or ( typ.Classtype.InheritsFrom( ancestorClass_ ) ) ) then
            descendantClasses_.Add( typ.Classtype );
      end;
    finally
      ctx.Free
    end;
  end else
    raise Exception.Create('' );
end;

它什么也不收集。所有列表项的typ.Classtype.QualifiedClassName始终为TRTTIInstanceTypetyp.Qualifiedname存储正确的类型名称。但是,如果TClass是记录本身,我如何访问称为typ.Qualifiedname的{​​{1}}?

我无法使用Delphi帮助弄清楚。

解决方法

您需要查看SANCTUM_STATEFUL_DOMAINS="localhost,127.0.0.1" SESSION_DOMAIN=".sanctum.local" 是否为TRttiInstanceType类型,是否可以访问其MetaclassType属性:

typ