You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:05:20