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

时间:2019-03-21 14:33:50

标签: delphi 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相同,该如何递归调用此过程?

2 个答案:

答案 0 :(得分:5)

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

顺便说一句,您的支票if AProp.PropertyType is TObject then是错误的,因为是的,PropertType当然是TObject(它是TRttiType对象)。您可能是指if AProp.PropertyType.IsInstance then(属性的类型是类类型)

答案 1 :(得分:3)

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

您将不得不使用RTTI来实现此功能,而不是使用通用方法。代替使用通用参数指定类型,而使用类型TRttiType的标准参数。