RTTI, общее решение, повторное использование кода из другого потока

Эта функция должна преобразовать решение, указанное в: eval поля записи в повторно используемую функцию. На самом деле этот код ниже не компилируется, и я понятия не имею, как заставить его работать...

procedure EnumerateFieldandValues(const m: TObject; RecordParams: TStringList);
var
  i: Integer;
  rtype: TRTTIType;
  fields: TArray<TRttiField>;
begin
  rtype := TRttiContext.Create.GetType(TypeInfo(TObject.ClassType));
  // Memo1.Lines.Add(rtype.ToString);
  fields := rtype.GetFields;
  for i := 0 to High(fields) do
    RecordParams.Add(Format('%s: %s :: %s', [fields[i].Name,
      fields[i].FieldType.ToString, fields[i].GetValue(@m).ToString]));

end;

person user1769184    schedule 23.05.2014    source источник
comment
Когда вы говорите, что не компилируется, вы также должны указать ошибку компилятора (и указать строку, которая вызывает ее в коде). Пожалуйста, измените, чтобы сделать это. У вас есть эта информация прямо перед вами, поэтому нет абсолютно никаких причин не предоставить ее нам.   -  person Ken White    schedule 23.05.2014
comment
не TypeInfo(TObject.ClassType), а TypeInfo(m.ClassType)   -  person Igor    schedule 23.05.2014
comment
m.classtype дает другую ошибку: [DCC Fehler] Unit_rttiValues.pas(162): E2133 Standardfunktion TYPEINFO erwartet einen Typbezeichner   -  person user1769184    schedule 23.05.2014
comment
Вы не обсуждаете в той ветке - почему?   -  person MBo    schedule 23.05.2014
comment
@Igor, если вам нужна информация о типе объекта, вы можете просто запросить ее напрямую: m.ClassInfo. TypeInfo — это магическая функция компилятора, для которой требуется идентификатор типа, а не ссылка на класс. Он оценивается во время компиляции, поэтому, если код вообще скомпилируется, он предоставит вам информацию о типе метода ClassType, который просто TClass.   -  person Rob Kennedy    schedule 23.05.2014
comment
Почему вы пытаетесь адаптировать код записи из одного ответа на этот вопрос, когда в другом ответе уже есть версия объекта?   -  person Rob Kennedy    schedule 23.05.2014
comment
хочу сделать универсальную функцию, куда я могу передавать разные записи или класс для дампа содержимого полей и имен полей; предыдущий ответ действителен только для данного типа записи.   -  person user1769184    schedule 24.05.2014


Ответы (1)


Вы делаете несколько ошибок в своем коде. Попробуйте это вместо этого:

procedure EnumerateFieldAndValues(m: TObject; RecordParams: TStrings);
var
  rtype: TRttiType;
  field: TRttiField;
begin
  rtype := TRttiContext.Create.GetType(m.ClassType);
  // Memo1.Lines.Add(rtype.ToString);
  for field in rtype.GetFields do
    RecordParams.Add(Format('%s: %s :: %s', [field.Name, field.FieldType.ToString, field.GetValue(m).ToString]));
end;
person Remy Lebeau    schedule 23.05.2014