Serg's answer is good, but it is better to avoid exceptions by skipping some types:
uses Rtti, TypInfo; procedure TForm4.GetObjectProperties(AObject: TObject; AList: TStrings); var ctx: TRttiContext; rType: TRttiType; rProp: TRttiProperty; AValue: TValue; sVal: string; const SKIP_PROP_TYPES = [tkUnknown, tkInterface]; begin if not Assigned(AObject) and not Assigned(AList) then Exit; ctx := TRttiContext.Create; rType := ctx.GetType(AObject.ClassInfo); for rProp in rType.GetProperties do begin if (rProp.IsReadable) and not (rProp.PropertyType.TypeKind in SKIP_PROP_TYPES) then begin AValue := rProp.GetValue(AObject); if AValue.IsEmpty then begin sVal := 'nil'; end else begin if AValue.Kind in [tkUString, tkString, tkWString, tkChar, tkWChar] then sVal := QuotedStr(AValue.ToString) else sVal := AValue.ToString; end; AList.Add(rProp.Name + '=' + sVal); end; end; end;
Linas source share