每日程炼-Rtti 读取类读取类结构和类的强制转换

  • A+
所属分类:[开发技巧]

任何数据类型中 Rtti 中都有对应的获取信息的类, 有序类型对应的是 TRttiOrdinalType.

DEMO下载Rtti3

代码部分: //任何数据类型中 Rtti 中都有对应的获取信息的类, 有序类型对应的是 TRttiOrdinalType. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) mmo1: TMemo; btn1: TButton; btn2: TButton; btn3: TButton; procedure btn1Click(Sender: TObject); procedure btn2Click(Sender: TObject); procedure btn3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses Rtti,TypInfo; procedure TForm1.btn1Click(Sender: TObject); var t: TRttiOrdinalType; begin mmo1.Clear; //先从类型名获取类型信息对象 t := TRttiContext.Create.GetType(TypeInfo(Byte)) as TRttiOrdinalType; mmo1.Lines.Add(Format('%s - %s', [t.Name, t.QualifiedName])); mmo1.Lines.Add(Format('Size: %d', [t.TypeSize])); mmo1.Lines.Add('QualifiedName: ' + t.QualifiedName); mmo1.Lines.Add(Format('Min,Max: %d , %d', [t.MinValue, t.MaxValue])); mmo1.Lines.Add(EmptyStr); //空字串 //可以用 AsOrdinal 方法代替前面的 as TRttiOrdinalType t := TRttiContext.Create.GetType(TypeInfo(Word)).AsOrdinal; mmo1.Lines.Add(Format('%s: %s', [t.Name, t.QualifiedName])); mmo1.Lines.Add(Format('Size: %d', [t.TypeSize])); mmo1.Lines.Add(Format('Min,Max: %d , %d', [t.MinValue, t.MaxValue])); mmo1.Lines.Add(EmptyStr); //也可以直接强制转换 t := TRttiOrdinalType(TRttiContext.Create.GetType(TypeInfo(Integer))); mmo1.Lines.Add(Format('%s: %s', [t.Name, t.QualifiedName])); mmo1.Lines.Add(Format('Size: %d', [t.TypeSize])); mmo1.Lines.Add(Format('Min,Max: %d , %d', [t.MinValue, t.MaxValue])); mmo1.Lines.Add(EmptyStr); end; //下面以 TPoint 为例, 用 TRttiRecordType 读取了结构的信息. procedure TForm1.btn2Click(Sender: TObject); var t: TRttiRecordType; f: TRttiField; begin mmo1.Clear; t := TRttiContext.Create.GetType(TypeInfo(TPoint)).AsRecord; mmo1.Lines.Add(t.QualifiedName); mmo1.Lines.Add(Format('Size: %d', [t.TypeSize])); mmo1.Lines.Add(EmptyStr); mmo1.Lines.Add(Format('字段数: %d', [Length(t.GetFields)])); mmo1.Lines.Add(Format('方法数: %d', [Length(t.GetMethods)])); mmo1.Lines.Add(Format('属性数: %d', [Length(t.GetProperties)])); mmo1.Lines.Add(EmptyStr); mmo1.Lines.Add('全部字段:'); for f in t.GetFields do mmo1.Lines.Add(f.ToString); end; procedure TForm1.btn3Click(Sender: TObject); var ms: TArray<TRttiMethod>; m: TRttiMethod; mps: TArray<TRttiParameter>; mp: TRttiParameter; begin mmo1.Clear; {先获取方法集合, 这里随便使用了 TButton 类} ms := TRttiContext.Create.GetType(TButton).GetMethods; for m in ms do begin {方法名称} mmo1.Lines.Add('方法名称: ' + m.Name); {方法类型: proceedure、function 等} mmo1.Lines.Add('方法类型: ' + GetEnumName(TypeInfo(TMethodKind), Ord(m.MethodKind))); {方法的返回值类型} if Assigned(m.ReturnType) then mmo1.Lines.Add('返回值: ' + GetEnumName(TypeInfo(TTypeKind), Ord(m.ReturnType.TypeKind))); {方法的参数列表} mps := m.GetParameters; if Length(mps) > 0 then begin mmo1.Lines.Add('参数:'); for mp in mps do mmo1.Lines.Add(mp.ToString); //还可以通过 mp.ParamType 获取参数的数据类型 //还可以通过 mp.Flags 获取参数的修饰符(譬如 var、const 等) end; mmo1.Lines.Add(EmptyStr); end; end; end. 窗体部分: object Form1: TForm1 Left = 0 Top = 0 Caption = #24858#20154#31508#35760'-http://www.yrnote.com' ClientHeight = 285 ClientWidth = 444 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object mmo1: TMemo Left = 0 Top = 8 Width = 436 Height = 201 ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 Lines.Strings = ( 'mmo1') TabOrder = 0 end object btn1: TButton Left = 40 Top = 240 Width = 75 Height = 25 Caption = 'TRttiOrdinalType' TabOrder = 1 OnClick = btn1Click end object btn2: TButton Left = 160 Top = 240 Width = 75 Height = 25 Caption = 'TRttiRecordType' TabOrder = 2 OnClick = btn2Click end object btn3: TButton Left = 304 Top = 240 Width = 75 Height = 25 Caption = 'GetEnumName' TabOrder = 3 OnClick = btn3Click end end

 

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
广告也精彩
avatar
广告也精彩

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: