能否通过Delphi新RTTI库从字符串中获取TypeInfo?
通过类型名称字符串获取TypeInfo的实现方案
当然可以实现这个需求!在Delphi中,我们可以利用**运行时类型信息(RTTI)**来通过类型名称字符串获取对应的TypeInfo。下面分不同Delphi版本给出具体实现:
一、Delphi 2010及以上版本(推荐)
从Delphi 2010开始,官方引入了强大的RTTI库,能轻松处理这种场景。不过需要注意:自定义的record类型默认不会生成RTTI信息,我们需要通过编译指令或属性来开启。
步骤1:确保目标类型包含RTTI信息
首先给你的TSomeValues添加编译指令,确保它的类型信息能被RTTI访问:
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([vcPublic])} type TSomeValues = record ValueOne: Integer; ValueTwo: string; end;
或者在Delphi XE及以后,也可以使用[Serializable]属性来简化:
type [Serializable] TSomeValues = record ValueOne: Integer; ValueTwo: string; end;
步骤2:实现ReturnTypeInfo函数
利用TRttiContext来查找类型并获取TypeInfo:
uses Rtti; function ReturnTypeInfo(aTypeName: string): PTypeInfo; var Context: TRttiContext; RttiType: TRttiType; begin Result := nil; // 初始化RTTI上下文 Context := TRttiContext.Create; try // 根据类型名称查找对应的RTTI类型 RttiType := Context.FindType(aTypeName); if Assigned(RttiType) then Result := RttiType.Handle; // 获取TypeInfo指针 finally Context.Free; end; end;
步骤3:调用示例
你的Button1Click可以保持不变,直接调用即可:
procedure Button1Click(Sender: TObject); var _TypeInfo: PTypeInfo; begin _TypeInfo := ReturnTypeInfo('TSomeValues'); if Assigned(_TypeInfo) then ShowMessage('成功获取TypeInfo: ' + _TypeInfo.Name) else ShowMessage('未找到指定类型'); end;
二、Delphi 2009及更早版本(无RTTI库)
在这些旧版本中,官方没有提供直接通过字符串查找record类型的API,我们需要手动维护一个类型映射表:
实现方案
uses Contnrs; var TypeMap: TStringList; // 初始化类型映射表,在程序启动时调用 procedure InitTypeMap; begin TypeMap := TStringList.Create; TypeMap.Add('TSomeValues=' + IntToStr(Integer(TypeInfo(TSomeValues)))); // 可以添加更多需要查找的类型 end; // 释放类型映射表,在程序退出时调用 procedure FreeTypeMap; begin TypeMap.Free; end; function ReturnTypeInfo(aTypeName: string): PTypeInfo; var Index: Integer; TypeAddr: Integer; begin Result := nil; Index := TypeMap.IndexOfName(aTypeName); if Index <> -1 then begin TypeAddr := StrToInt(TypeMap.ValueFromIndex[Index]); Result := PTypeInfo(TypeAddr); end; end;
这种方案需要手动注册所有需要查找的类型,灵活性较差,仅适合旧版本兼容场景。
内容的提问来源于stack exchange,提问作者Leo Bruno
相关产品推荐
相关产品推荐

