我正在使用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相同,该如何递归调用此过程?
答案 0 :(得分:5)
以与TObject
一起使用的非通用方法来完成所有工作。
您可以从AObj.ClassType
或AObj.ClassInfo
获取类型,并将其传递给AContext.GetType
。
顺便说一句,您的支票if AProp.PropertyType is TObject then
是错误的,因为是的,PropertType当然是TObject
(它是TRttiType
对象)。您可能是指if AProp.PropertyType.IsInstance then
(属性的类型是类类型)
答案 1 :(得分:3)
泛型是编译时的构造。类型参数必须在编译时解析。由于您在编译时不知道类型,因此无法调用通用方法。
您将不得不使用RTTI来实现此功能,而不是使用通用方法。代替使用通用参数指定类型,而使用类型TRttiType
的标准参数。