Я пытаюсь рекурсивно перечислить опубликованные свойства объекта с помощью RTTI, чтобы получить строку структуры, подобную этому свойству = значение.Как я могу бросить подобъекты?
class function TJSONUtils.ToString(aSender : TObject ; aLevel : integer = 0) : string;
const
SKIP_PROP_TYPES = [tkUnknown, tkInterface];
var
vC : TRttiContext;
vType : TRttiType;
vProperty : TRttiProperty;
s : string;
vValue : TValue;
vVal: string;
begin
vC := TRttiContext.Create;
vType := vC.GetType(aSender.ClassInfo);
for vProperty in vType.GetProperties do
begin
if (vProperty.IsReadable) and not (vProperty.PropertyType.TypeKind in SKIP_PROP_TYPES) and (vProperty.Visibility = mvPublished ) then
begin
AValue := vProperty.GetValue(aSender);
if AValue.IsEmpty then
begin
vVal := 'nil';
end
else
begin
if AValue.Kind in [tkUString, tkString, tkWString, tkChar, tkWChar] then
vVal := QuotedStr(AValue.ToString)
else
vVal := AValue.ToString;
end;
if pos(' @', sval) > 0 then
begin
s := s + vProperty.Name + ' => ' + TJSONUtils.ToString(TObject(AValue)); // here is the problem
end
else
s := s + inttostr(aLevel) + ' - ' + vProperty.Name + '=' + vVal + #$D#$A;
end;
end;
result := s;
end;
Объект может быть для примера: TFill, который содержит подобъект TGradient, который содержит TGradientPoints (3 подуровня)
var
fFill : TBrush;
begin
fFill := TBrush.create;
try
showmessage(TJSONUtils.ToString(fFill, 0));
finally
fFill.free;
end;
end;
какМогу ли я перечислить все элементы объекта и дочерних объектов, пока не перейдем к базовым типам: строка, целое число, число с плавающей запятой и т. д ...?