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

如何在Delphi中编写泛型方法将记录中所有字符串转为小写?

实现记录字符串字段转小写的RTTI方案

需求说明

需要实现一个过程,遍历记录的所有字段,将其中的字符串字段转换为小写,预期结构如下:

procedure RecordStringToLower(var MyRecord);
begin
  // 1. Loop through all fields
  // 2. Find string fields
  // 3. Convert all string fields to lowercase
end;

问题分析(原尝试代码)

你提供的泛型记录助手代码无法正常运行,核心问题在于:

  1. 仅处理了tkString类型(短字符串),未覆盖Delphi中常见的AnsiString(tkLString)和默认string(tkUString)类型
  2. 字符串类型转换后直接设置值,未匹配字段实际的字符串类型,导致类型不兼容

修正后的实现方案

以下是通用的泛型过程实现,覆盖所有常见字符串类型,且无需依赖记录助手:

uses
  System.Rtti;

procedure RecordStringToLower<T>(var ARecord: T);
var
  Context: TRttiContext;
  RttiType: TRttiType;
  Field: TRttiField;
  FieldValue: TValue;
  LowerStr: string;
begin
  Context := TRttiContext.Create;
  try
    RttiType := Context.GetType(TypeInfo(T));
    // 仅处理记录类型
    if RttiType.TypeKind <> tkRecord then
      Exit;

    for Field in RttiType.GetFields do
    begin
      case Field.FieldType.TypeKind of
        // 覆盖所有字符串类型:短字符串、AnsiString、UnicodeString
        tkString, tkLString, tkUString:
          begin
            FieldValue := Field.GetValue(@ARecord);
            LowerStr := FieldValue.AsString.ToLower;
            // 根据字段实际类型设置回对应值
            case Field.FieldType.TypeKind of
              tkString: Field.SetValue(@ARecord, TValue.From<string>(LowerStr));
              tkLString: Field.SetValue(@ARecord, TValue.From<AnsiString>(AnsiString(LowerStr)));
              tkUString: Field.SetValue(@ARecord, TValue.From<string>(LowerStr));
            end;
          end;
      end;
    end;
  finally
    Context.Free;
  end;
end;

使用示例

type
  TUserRecord = record
    ID: Integer;
    UserName: string;
    Remark: AnsiString;
    ShortInfo: String[20];
  end;

var
  User: TUserRecord;
begin
  User.UserName := 'JOHN_DOE';
  User.Remark := 'ADMIN_USER';
  User.ShortInfo := 'ACTIVE';
  
  RecordStringToLower<TUserRecord>(User);
  // 转换后:UserName='john_doe',Remark='admin_user',ShortInfo='active'
end;

关键注意事项

  • 必须引用System.Rtti单元,否则无法使用RTTI相关类
  • 如果需要处理嵌套记录中的字符串字段,可以添加递归逻辑:当字段类型为tkRecord时,递归调用RecordStringToLower处理该字段
  • 代码会自动忽略非字符串类型的字段,符合需求只处理字符串内容

内容的提问来源于stack exchange,提问作者Shaun Roselt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:15:09