Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用delphi和RTTI递归调用泛型过程?_Delphi_Rtti - Fatal编程技术网

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

如何使用delphi和RTTI递归调用泛型过程?,delphi,rtti,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.GetPrope

我正在开发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类型的标准参数,而不是使用泛型参数来指定类型

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


顺便说一下,如果您检查AProp.PropertyType是否为TObject,那么就错了,因为是的,当然PropertyType是TObject,它是TrtType对象。您可能的意思是,如果AProp.PropertyType.IsInstance是类类型的属性类型

要获取实际属性,您需要在类的实例上获取它,在本例中为_AObj。但正如其他人所说,您需要测试IsInstance,然后是AProp.GetValue_AObj。您可以使用TValue来获取对象。但是它有自己的类型,所以不可能递归。