如何在Delphi中编写泛型方法将记录中所有字符串转为小写?
实现记录字符串字段转小写的RTTI方案
需求说明
需要实现一个过程,遍历记录的所有字段,将其中的字符串字段转换为小写,预期结构如下:
procedure RecordStringToLower(var MyRecord); begin // 1. Loop through all fields // 2. Find string fields // 3. Convert all string fields to lowercase end;
问题分析(原尝试代码)
你提供的泛型记录助手代码无法正常运行,核心问题在于:
- 仅处理了
tkString类型(短字符串),未覆盖Delphi中常见的AnsiString(tkLString)和默认string(tkUString)类型 - 字符串类型转换后直接设置值,未匹配字段实际的字符串类型,导致类型不兼容
修正后的实现方案
以下是通用的泛型过程实现,覆盖所有常见字符串类型,且无需依赖记录助手:
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
相关产品推荐
相关产品推荐

