Как мне перечислить все свойства объекта и получить их значения? - PullRequest
7 голосов
/ 30 декабря 2011

Я хочу перечислить все свойства: частные, защищенные, общедоступные и т. Д. Я хочу использовать встроенные средства и не использовать какой-либо сторонний код.

Ответы [ 3 ]

9 голосов
/ 30 декабря 2011

Ответ Серга хорош, но лучше избегать исключений, пропуская некоторые типы:

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;
6 голосов
/ 30 декабря 2011

Используйте Extended RTTI следующим образом (когда я тестировал код в XE, я получил исключение для свойства ComObject, поэтому я вставил try - кроме блока):

uses RTTI;
procedure TForm1.Button1Click(Sender: TObject);
var
  C: TRttiContext;
  T: TRttiType;
  F: TRttiField;
  P: TRttiProperty;

  S: string;

begin
  T:= C.GetType(TButton);
  Memo1.Lines.Add('---- Fields -----');
  for F in T.GetFields do begin
    S:= F.ToString + ' : ' + F.GetValue(Button1).ToString;
    Memo1.Lines.Add(S);
  end;

  Memo1.Lines.Add('---- Properties -----');
  for P in T.GetProperties do begin
    try
      S:= P.ToString;
      S:= S + ' : ' + P.GetValue(Button1).ToString;
      Memo1.Lines.Add(S);
    except
      ShowMessage(S);
    end;
  end;
end;
2 голосов
/ 30 декабря 2011

Вот отличная отправная точка, использующая расширенные возможности последней версии Delphi:

Следующая ссылка скорее предназначена для ранней версии (начиная с D5).Основанный на модуле TypInfo.pas, он ограничен, но все еще поучителен:

...