如何使用delphi和RTTI递归调用泛型过程?
我正在开发Delphi 10.2 Tokyo,面临以下情况: 假设我有以下步骤来验证对象的属性:如何使用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
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来获取对象。但是它有自己的类型,所以不可能递归。