天天看点

Rtti单元(1)获取类的方法、属性、字段的列表

通过 Rtti 单元的 TRttiContext(是个 record), 可以方便地获取类的方法、属性、字段的列表.

unit Unit1; 

 

interface 

uses 

 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 

 Dialogs, StdCtrls; 

type 

 TForm1 = class(TForm) 

  Memo1: TMemo; 

  Button1: TButton; 

  Button2: TButton; 

  Button3: TButton; 

  Button4: TButton; 

  Button5: TButton; 

  procedure Button1Click(Sender: TObject); 

  procedure Button2Click(Sender: TObject); 

  procedure Button3Click(Sender: TObject); 

  procedure Button4Click(Sender: TObject); 

  procedure Button5Click(Sender: TObject); 

 end; 

var 

 Form1: TForm1; 

implementation 

{$R *.dfm}  

uses Rtti; 

//TRttiContext.GetTypes 

procedure TForm1.Button1Click(Sender: TObject); 

 ctx: TRttiContext; 

 t: TRttiType; 

begin 

 Memo1.Clear; 

 for t in ctx.GetTypes do Memo1.Lines.Add(t.Name); 

end; 

//获取 TButton 类的方法 

procedure TForm1.Button2Click(Sender: TObject); 

 m: TRttiMethod; 

 t := ctx.GetType(TButton); 

 //for m in t.GetMethods do Memo1.Lines.Add(m.Name); 

 for m in t.GetMethods do Memo1.Lines.Add(m.ToString); 

//获取 TButton 类的属性 

procedure TForm1.Button3Click(Sender: TObject); 

 p: TRttiProperty; 

 //for p in t.GetProperties do Memo1.Lines.Add(p.Name); 

 for p in t.GetProperties do Memo1.Lines.Add(p.ToString); 

//获取 TButton 类的字段 

procedure TForm1.Button4Click(Sender: TObject); 

 f: TRttiField; 

 //for f in t.GetFields do Memo1.Lines.Add(f.Name); 

 for f in t.GetFields do Memo1.Lines.Add(f.ToString); 

//获取获取 TButton 类的方法集合、属性集合、字段集合 

procedure TForm1.Button5Click(Sender: TObject); 

 ms: TArray<TRttiMethod>; 

 ps: TArray<TRttiProperty>; 

 fs: TArray<TRttiField>; 

 ms := t.GetMethods; 

 ps := t.GetProperties; 

 fs := t.GetFields; 

 Memo1.Lines.Add(Format('%s 类共有 %d 个方法', [t.Name, Length(ms)])); 

 Memo1.Lines.Add(Format('%s 类共有 %d 个属性', [t.Name, Length(ps)])); 

 Memo1.Lines.Add(Format('%s 类共有 %d 个字段', [t.Name, Length(fs)])); 

end.

继续阅读