使用RTTI访问记录的所有元素

use*_*184 3 delphi rtti

我想将一个复杂/长记录转储到备忘录中以进行调试

 TmyRecord =
     aValue : String 
     aNumber : Real;
     Morenumbers   :  Integer ;
     ....
     ....
  end;
Run Code Online (Sandbox Code Playgroud)

我认为Delphi XE 2 RTTI应该让我有机会在循环中获取Fieldname,Fieldtype和value,将此记录写入备忘录或.....

MBo*_*MBo 14

作为起点 - 用简单类型记录.对于复杂的字段(数组,类等)探索RTTI单元

type
  TmyRecord = record
    aValue: String;
    aNumber: Real;
    Morenumbers: Integer;
  end;
var
  m: TMyRecord;
  rtype: TRTTIType;
  fields: TArray<TRttiField>;
  i: Integer;
begin
  m.aValue := 'OK';
  m.aNumber := Pi;
  m.Morenumbers := 666;
  rtype := TRTTIContext.Create.GetType(TypeInfo(TMyrecord));
  Memo1.Lines.Add(rtype.ToString);
  fields := rtype.GetFields;
  for i := 0 to High(fields) do
    Memo1.Lines.Add(Format('%s: %s :: %s', [
      fields[i].Name,
      fields[i].FieldType.ToString,
      fields[i].GetValue(@m).ToString]));
Run Code Online (Sandbox Code Playgroud)

输出:

TmyRecord
aValue: string :: OK
aNumber: Real :: 3.14159265358979
Morenumbers: Integer :: 666
Run Code Online (Sandbox Code Playgroud)