Delphi RTTI 从记录中获取值

Mil*_*mek 5 delphi rtti codesite

寻求帮助从记录获取值到 CodeSite。虽然我有基本值(整数,字符串..)的记录,但一切正常。

但是问题来自记录中的数组。

姓氏:WideChar 的
数组[0..35] 名称:WideChar 的数组[0..25]

(我找到了这个,但有什么办法吗?)
对于静态数组,使用 RTTI 获取记录字段类型失败

虽然我想获取 Surname / Name 的字段值,但 TRttiField.FieldType.TypeKind 为空。

任何人都知道如何将属性的值转换为字符串?

有我的程序。

class procedure TCodeSite.SendObject<T>(Category: String; lObject : T; Msg: String);
var
lRTTIContext : TRttiContext;
lRTTIObjectType : TRttiType;
lRTTIField : TRttiField;
lRTTIRecordInRecord : TRttiRecordType;
lRTTIFieldInRecord : TRttiField;
lRTTIPointerType : TRttiPointerType;
lRTTIPointerValue : TValue;
lFieldName : string;
lFieldNameInRecord : string;
lStringList : TStringList;
begin
  {$IfNDef CodeSiteDisabled}
    if isActiveDebugCategory(Category) then
begin
  lStringList := TStringList.Create;
  lRTTIContext := TRttiContext.Create;
  lRTTIObjectType := lRTTIContext.GetType(TypeInfo(T));

  if lRTTIObjectType.TypeKind = tkRecord then
  begin
    for lRTTIField in lRTTIObjectType.GetFields do
    begin

      lFieldName := ParseFieldName(lRTTIField.ToString);

      case lRTTIField.FieldType.TypeKind of
        tkRecord:
          begin
            lRTTIRecordInRecord := lRTTIField.FieldType.AsRecord;
            lStringList.Add(lFieldName);
            for lRTTIFieldInRecord in lRTTIRecordInRecord.GetFields do
            begin
               lFieldNameInRecord := ParseFieldName(lRTTIFieldInRecord.ToString);
               lStringList.Add('    '+lFieldNameInRecord +' '+GetFieldValue<T>(Addr(lObject), lRTTIFieldInRecord));
            end;
          end;
        tkPointer:
          begin
            lRTTIPointerType := lRTTIField.FieldType as TRttiPointerType;

            if lRTTIPointerType.ReferredType.TypeKind = tkRecord then
            begin
              lRTTIPointerValue := lRTTIField.GetValue(Addr(lObject));
              if (not lRTTIPointerValue.IsEmpty) then
              begin
                for lRTTIFieldInRecord in lRTTIPointerType.ReferredType.GetFields do
                begin
                    lStringList.Add(lFieldName + GetFieldValue<T>(Addr(lObject), lRTTIFieldInRecord));
                end;
              end;
            end;
          end
            else lStringList.Add(lFieldName + ' ' + GetFieldValue<T>(Addr(lObject), lRTTIField));
      end;
    end;

    CodeSite.Category := Category;
    CodeSite.Send(Msg, lStringList);
  end;
  lRTTIContext.Free;
end;
  {$EndIf}
end;
Run Code Online (Sandbox Code Playgroud)

从字段中获取值的第二个过程

class function TCodeSite.GetFieldValue<T>(const pipInstance : Pointer;
                               const piclField : TRttiField) : string;
begin
  if not (Assigned(piclField.FieldType))  then
   begin
    Result := 'Pica';
     Exit;
  end;

case piclField.FieldType.TypeKind of
  tkEnumeration : Result := BoolToStr(piclField.GetValue(pipInstance).AsBoolean);
  tkFloat: Result := FloatToStr(piclField.GetValue(pipInstance).AsExtended);
  tkInt64: Result := IntToStr(piclField.GetValue(pipInstance).AsInt64);
  tkInteger: Result := IntToStr(piclField.GetValue(pipInstance).AsInteger);
  tkString,tkUString: Result := Trim(piclField.GetValue(pipInstance).AsString);
end;
 end;
Run Code Online (Sandbox Code Playgroud)