rtti

// 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;

posted @ 2012-02-11 22:04  delphi中间件  阅读(555)  评论(0编辑  收藏  举报