博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
rtti
阅读量:5011 次
发布时间:2019-06-12

本文共 3789 字,大约阅读时间需要 12 分钟。

// Rtti调用类的方法

procedure TForm1.Button1Click(Sender: TObject);
var
  obj: TMyClass;
  t: TRttiType;
  m1,m2: TRttiMethod;
  r: TValue;
begin
  t := TRttiContext.Create.GetType(TMyClass);
  m1 := t.GetMethod('msg');
  m2 := t.GetMethod('Add');
  obj := TMyClass.Create(Self);
  m1.Invoke(obj, ['Delphi 2010']);  
  r := m2.Invoke(obj, [1, 2]);
  ShowMessage(IntToStr(r.AsInteger));
  obj.Free;
end;
// Rtti获取方法类型、返回值、参数
uses Rtti,TypInfo;
procedure TForm1.Button1Click(Sender: TObject);
var
  ms: TArray<TRttiMethod>;
  m: TRttiMethod;
  mps: TArray<TRttiParameter>;
  mp: TRttiParameter;
begin
  Memo1.Clear;
  ms := TRttiContext.Create.GetType(TButton).GetMethods;
  for m in ms do
  begin
    {方法名称}
    Memo1.Lines.Add('方法名称: ' + m.Name);
    {方法类型: proceedure、function 等}
    Memo1.Lines.Add('方法类型: ' + GetEnumName(TypeInfo(TMethodKind), Ord(m.MethodKind)));
    {方法的返回值类型}
    if Assigned(m.ReturnType) then
      Memo1.Lines.Add('返回值: ' + GetEnumName(TypeInfo(TTypeKind), Ord(m.ReturnType.TypeKind)));
    {方法的参数列表}
    mps := m.GetParameters;
    if Length(mps) > 0 then
    begin
      Memo1.Lines.Add('参数:');
      for mp in mps do Memo1.Lines.Add(mp.ToString);
      //还可以通过 mp.ParamType 获取参数的数据类型
      //还可以通过 mp.Flags 获取参数的修饰符(譬如 var、const 等)
    end;
    Memo1.Lines.Add(EmptyStr);
  end;
end;
// Rtti修改和获取类的属性
procedure TForm1.Button2Click(Sender: TObject);
var
  obj: TMyClass;
  t: TRttiType;
  p: TRttiProperty;
  r: TValue;
begin
  obj := TMyClass.Create(Self);
  t := TRttiContext.Create.GetType(TMyClass);
  p := t.GetProperty('Name');
  p.SetValue(obj, 'NewName');
  r := p.GetValue(obj);
  ShowMessage(r.AsString);
  obj.Free;
end;
// Rtti设置枚举值
procedure TForm1.Button3Click(Sender: TObject);
var
  t: TRttiType;
  p: TRttiProperty;
  r: TValue;
begin
  t := TRttiContext.Create.GetType(TButton);
  p := t.GetProperty('Align');
  p.SetValue(Button1, TValue.FromOrdinal(TypeInfo(TAlign), Ord(alLeft)));
  r := p.GetValue(Button1);
  ShowMessage(IntToStr(r.AsOrdinal));
end;
// Rtti获取类的字段
procedure TForm1.Button4Click(Sender: TObject);
var
  ctx: TRttiContext;
  t: TRttiType;
  f: TRttiField;
begin
  Memo1.Clear;
  t := ctx.GetType(TButton);
  for f in t.GetFields do Memo1.Lines.Add(f.ToString);
end;
// Rtti获取结构体的信息
procedure TForm1.Button1Click(Sender: TObject);
var
  t: TRttiRecordType;
  f: TRttiField;
begin
  Memo1.Clear;
  t := TRttiContext.Create.GetType(TypeInfo(TPoint)).AsRecord;
  Memo1.Lines.Add(t.QualifiedName);
  Memo1.Lines.Add(Format('Size: %d', [t.TypeSize]));
  Memo1.Lines.Add(EmptyStr);
  Memo1.Lines.Add(Format('字段数: %d', [Length(t.GetFields)]));
  Memo1.Lines.Add(Format('方法数: %d', [Length(t.GetMethods)]));
  Memo1.Lines.Add(Format('属性数: %d', [Length(t.GetProperties)]));
  Memo1.Lines.Add(EmptyStr);
  Memo1.Lines.Add('全部字段:');
  for f in t.GetFields do Memo1.Lines.Add(f.ToString);
end;
// Rtti获取有序类型的信息
procedure TForm1.Button1Click(Sender: TObject);
var
  t: TRttiOrdinalType;
begin
  Memo1.Clear;
  //先从类型名获取类型信息对象
  t := TRttiContext.Create.GetType(TypeInfo(Byte)) as TRttiOrdinalType;
  Memo1.Lines.Add(Format('%s - %s', [t.Name, t.QualifiedName]));
  Memo1.Lines.Add(Format('Size: %d', [t.TypeSize]));
  Memo1.Lines.Add('QualifiedName: ' + t.QualifiedName);
  Memo1.Lines.Add(Format('Min,Max: %d , %d', [t.MinValue, t.MaxValue]));
  Memo1.Lines.Add(EmptyStr); //空字串
  //可以用 AsOrdinal 方法代替前面的 as TRttiOrdinalType
  t := TRttiContext.Create.GetType(TypeInfo(Word)).AsOrdinal;
  Memo1.Lines.Add(Format('%s: %s', [t.Name, t.QualifiedName]));
  Memo1.Lines.Add(Format('Size: %d', [t.TypeSize]));
  Memo1.Lines.Add(Format('Min,Max: %d , %d', [t.MinValue, t.MaxValue]));
  Memo1.Lines.Add(EmptyStr);
  //也可以直接强制转换
  t := TRttiOrdinalType(TRttiContext.Create.GetType(TypeInfo(Integer)));
  Memo1.Lines.Add(Format('%s: %s', [t.Name, t.QualifiedName]));
  Memo1.Lines.Add(Format('Size: %d', [t.TypeSize]));
  Memo1.Lines.Add(Format('Min,Max: %d , %d', [t.MinValue, t.MaxValue]));
  Memo1.Lines.Add(EmptyStr);
end;

转载于:https://www.cnblogs.com/hnxxcxg/archive/2012/02/11/2347144.html

你可能感兴趣的文章
Java进阶知识点6:并发容器背后的设计理念 - 锁分段、写时复制和弱一致性
查看>>
Makefile ===> Makefile 快速学习
查看>>
face detection[HR]
查看>>
java性能调优工具
查看>>
C# 其他的Url 文件的路径转化为二进制流
查看>>
cmake使用
查看>>
ios7上隐藏status bar
查看>>
构造方法和全局变量的关系
查看>>
python3基础05(有关日期的使用1)
查看>>
ArrayList的使用方法
查看>>
面向对象高级
查看>>
Bitwise And Queries
查看>>
打印Ibatis最终的SQL语句
查看>>
HBase之八--(3):Hbase 布隆过滤器BloomFilter介绍
查看>>
oracle连接问题ORA-00604,ORA-12705
查看>>
NOI 2019 退役记
查看>>
java的几个日志框架log4j、logback、common-logging
查看>>
Java从零开始学十三(封装)
查看>>
Python2和Python3中的rang()不同之点
查看>>
MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)...
查看>>