如何使用 delphi 和 RTTI 递归调用通用过程?

How to call a Generic procedure recursively with delphi and RTTI?

我正在开发 Delphi 10.2 Tokyo 并面临以下情况:

假设我有以下过程来验证对象的属性:

procedure TGenericUnit.VerifyProps<T>(_AObj: T);
var
   AContext: TRttiContext;
   AType: TRttiType;
   AProp: TRttiProperty;
begin
   AType := AContext.GetType(T);
   for AProp in AType.GetProperties do
      if AProp.PropertyType is TObject then
         // VerifyProps<?>(?);  
end;

如果我不知道它是什么类型的对象并且它不一定与T相同,我如何递归调用这个过程?

泛型是一种编译时结构。类型参数必须在编译时解析。由于在编译时不知道类型,因此无法调用泛型方法。

您必须使用 RTTI 来实现,而不是使用通用方法。不使用通用参数来指定类型,而是使用类型 TRttiType 的标准参数。

使用 TObject 以非通用方法完成所有工作。 您可以从 AObj.ClassTypeAObj.ClassInfo 获取类型并将其传递给 AContext.GetType

顺便说一下,您的检查 if AProp.PropertyType is TObject then 是错误的,因为是的,当然 PropertType 是一个 TObject(它是一个 TRttiType 对象)。你的意思大概是if AProp.PropertyType.IsInstance then(是属性类型的class类型)