delpi中的RTTI初试

java中的反射机制使我们能够在运行期间获取运行期类的信息,那么在delphi中有没有这样的功能呢?答案是有,实现这种功能的机制在delphi中叫做RTTI,废话少说,先来一段demo:

 

1.先定义一个demo类,注意这个类必须要以TPersistent为基类,代码如下:

unit Unit2;

interface
{ TDemo }

uses  Classes ;

type

  TDemo = class(TPersistent)
  private

  protected

  public
    FName : string;
    FAge : Integer;
    constructor Create;
    destructor Destroy; override;
  published
    property Name : string read FName write FName;
    property Age : Integer read FAge write FAge;
  end;

implementation

{ TDemo }

constructor TDemo.Create;
begin
  FName := 'peirenlei';
end;

destructor TDemo.Destroy;
begin

  inherited;
end;

end.

 

  

 

2.接下来,创建一个这个类的实例:

  ADemo := TDemo.Create;

   ADemo.Name := 'peirenlei';
   ADemo.Age := 0;

 

 

3.获取该实例的属性列表:

var
  APropList:PPropList;
  ATypeInfo:PTypeInfo;
  AClasDateInfo:PTypeData;
  I : Integer;
begin
  ATypeInfo := ADemo.ClassInfo;
  AClasDateInfo := GetTypeData(ATypeInfo);
  if AClasDateInfo.PropCount <> 0 then
  begin
  //分配空间
    GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
    try
      GetPropInfos(ADemo.ClassInfo,APropList);  //得到类的属性列表
      for I := 0 to AClasDateInfo.PropCount - 1 do
      begin
        if APropList[I]^.PropType^.Kind <> tkMethod then
          mmo.Lines.Add(Format('%s:%s',[APropList[I]^.Name,APropList[I]^.PropType^.Name]));        
      end;
        
    finally
      FreeMem(APropList,sizeof(APropList)*AClasDateInfo.PropCount); 
    end;
  end;
end;

    输出:   

Name:string
Age:Integer

 

 

3. 获取类的方法列表:

var
  APropList:PPropList;
  ATypeInfo:PTypeInfo;
  AClasDateInfo:PTypeData;
  I ,NumPro : Integer;
begin
  ATypeInfo := ADemo.ClassInfo;
  AClasDateInfo := GetTypeData(ATypeInfo);
  if AClasDateInfo.PropCount <> 0 then
  begin
  //分配空间
    GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);

    try
      NumPro := GetPropList(ADemo.ClassInfo,[tkMethod],APropList);
      if NumPro <> 0 then
      begin
         mmo.Lines.Add('-----events-------');
         for I := 0 to NumPro - 1 do //获得事件属性的列表
         begin
           mmo.Lines.Add(Format('%s:%s',[APropList[i]^.Name,APropList[i]^.PropType^.Name]));
         end;
      end;
    finally
      FreeMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);
    end;
  end;
end;

 

4.获取实例类的属性和属性值:

var
  AProperInfo:PPropInfo;
  AValue:string;
begin
  AValue := GetPropValue(ADemo,'Name');
  mmo.Lines.Add('Name='+AValue);

  AValue := GetPropValue(ADemo,'Age');
  mmo.Lines.Add('Age='+AValue);

  SetPropValue(ADemo,'Name','zengzhen');
  SetPropValue(ADemo,'Age',100);
  AValue := GetPropValue(ADemo,'Name');
  mmo.Lines.Add('Name='+AValue);

  AValue := GetPropValue(ADemo,'Age');
  mmo.Lines.Add('Age='+AValue);
  
end;

 

  输出:

Name=peirenlei
Age=0
Name=zengzhen
Age=100

 

你可能感兴趣的:(Delphi)