如何使用 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.ClassType
或 AObj.ClassInfo
获取类型并将其传递给 AContext.GetType
。
顺便说一下,您的检查 if AProp.PropertyType is TObject then
是错误的,因为是的,当然 PropertType 是一个 TObject
(它是一个 TRttiType
对象)。你的意思大概是if AProp.PropertyType.IsInstance then
(是属性类型的class类型)
我正在开发 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.ClassType
或 AObj.ClassInfo
获取类型并将其传递给 AContext.GetType
。
顺便说一下,您的检查 if AProp.PropertyType is TObject then
是错误的,因为是的,当然 PropertType 是一个 TObject
(它是一个 TRttiType
对象)。你的意思大概是if AProp.PropertyType.IsInstance then
(是属性类型的class类型)