RTTI(Run-Time Type Information) 翻译过来的名称是“运行期类型信息”,也就是说可以在运行期获得数据类型或类(class)的信息。
D2007环境
需引用单元 TypInfo;
//类型的详细信息
//类型枚举列表
TTypeKind = (tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat,
tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString,
tkVariant, tkArray, tkRecord, tkInterface, tkInt64, tkDynArray);
PPTypeInfo = ^PTypeInfo;
PTypeInfo = ^TTypeInfo;
TTypeInfo = record
Kind: TTypeKind;
Name: ShortString;
{TypeData: TTypeData}
end;
获取对象属性相关信息
1、获取类(class)的详细信息,返回值(PTypeInfo)
class function TObject.ClassInfo: Pointer;
2、获取类(class)的属性(property)信息,返回值(PTypeData),所有属性列表。
function GetTypeData(TypeInfo: PTypeInfo): PTypeData;
ClassTypeData:PTypeData ;
ClassTypeData.PropCount ; //属性列表中的个数
3、获取属性列表,定长数组的指针。
procedure GetPropInfos(TypeInfo: PTypeInfo; PropList: PPropList);
PropList[i]^.PropType^.Kind 属性的类型;
PropList[i]^.PropType^.Name属性名 ;
PPropList = ^TPropList;
TPropList = array[0..16379] of PPropInfo;
PPropInfo = ^TPropInfo;
TPropInfo = packed record
PropType: PPTypeInfo;
GetProc: Pointer;
SetProc: Pointer;
StoredProc: Pointer;
Index: Integer;
Default: Longint;
NameIndex: SmallInt;
Name: ShortString;
end;
根据属性名获取属性对象
function GetObjectProp(Instance: TObject; const PropName: string;
MinClass: TClass = nil): TObject;
unit UnitMyType;
interface
uses classes,sysutils,TypInfo ;
type
{$M+}
TBaseType = class
public
Data : Variant ;
end;
TMyType = class
MyDefault : TBaseType ;
private
MyPublished : TBaseType ;
public
MyPulbic : Variant ;
published
property MyPublish : TBaseType read MyPublished write MyPublished ;
end;
{$M-}
procedure visit(alist : TStrings) ;
implementation
procedure visit(alist : TStrings) ;
var
lTypeInfo : PTypeInfo ;
lTypeData : PTypeData ;
lPropList: PPropList;
lcount : integer ;
i : integer ;
lkind,lname : string ;
begin
lTypeInfo := TMyType.ClassInfo ;
lTypeData := gettypedata(lTypeInfo) ;
lcount := lTypeData.PropCount ;
try
GetMem(lPropList, SizeOf(TPropInfo) * lcount);
GetPropInfos(lTypeInfo,lPropList) ;
for I := 0 to lcount- 1 do
begin
lkind := inttostr(ord(lPropList[i]^.PropType^.Kind) ) ;
lname := lPropList[i]^.PropType^.Name ;
alist.Add('kind:'+lkind+' name:'+lname)
end;
finally
FreeMem(lPropList);
end;
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,typinfo, StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
mmo1: TMemo;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses UnitMyType;
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
lt : Tstringlist ;
i: integer;
begin
lt := Tstringlist.Create ;
try
visit(lt) ;
mmo1.Lines.Clear ;
mmo1.Lines.AddStrings(lt);
finally
lt.Free ;
end;
end;
end.