delpi中的RTTI初试

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

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

Delphi代码  收藏代码
  1. unit Unit2;  
  2.   
  3. interface  
  4. { TDemo }  
  5.   
  6. uses  Classes ;  
  7.   
  8. type  
  9.   
  10.   TDemo = class(TPersistent)  
  11.   private  
  12.   
  13.   protected  
  14.   
  15.   public  
  16.     FName : string;  
  17.     FAge : Integer;  
  18.     constructor Create;  
  19.     destructor Destroy; override;  
  20.   published  
  21.     property Name : string read FName write FName;  
  22.     property Age : Integer read FAge write FAge;  
  23.   end;  
  24.   
  25. implementation  
  26.   
  27. { TDemo }  
  28.   
  29. constructor TDemo.Create;  
  30. begin  
  31.   FName := 'peirenlei';  
  32. end;  
  33.   
  34. destructor TDemo.Destroy;  
  35. begin  
  36.   
  37.   inherited;  
  38. end;  
  39.   
  40. end.  

  

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

Delphi代码  收藏代码
  1. ADemo := TDemo.Create;  
  2.   
  3.  ADemo.Name := 'peirenlei';  
  4.  ADemo.Age := 0;  

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

Delphi代码  收藏代码
  1. var  
  2.   APropList:PPropList;  
  3.   ATypeInfo:PTypeInfo;  
  4.   AClasDateInfo:PTypeData;  
  5.   I : Integer;  
  6. begin  
  7.   ATypeInfo := ADemo.ClassInfo;  
  8.   AClasDateInfo := GetTypeData(ATypeInfo);  
  9.   if AClasDateInfo.PropCount <> 0 then  
  10.   begin  
  11.   //分配空间  
  12.     GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);  
  13.     try  
  14.       GetPropInfos(ADemo.ClassInfo,APropList);  //得到类的属性列表  
  15.       for I := 0 to AClasDateInfo.PropCount - 1 do  
  16.       begin  
  17.         if APropList[I]^.PropType^.Kind <> tkMethod then  
  18.           mmo.Lines.Add(Format('%s:%s',[APropList[I]^.Name,APropList[I]^.PropType^.Name]));          
  19.       end;  
  20.           
  21.     finally  
  22.       FreeMem(APropList,sizeof(APropList)*AClasDateInfo.PropCount);   
  23.     end;  
  24.   end;  
  25. end;  

    输出:   

Delphi代码  收藏代码
  1. Name:string  
  2. Age:Integer  

3. 获取类的方法列表:

Delphi代码  收藏代码
  1. var  
  2.   APropList:PPropList;  
  3.   ATypeInfo:PTypeInfo;  
  4.   AClasDateInfo:PTypeData;  
  5.   I ,NumPro : Integer;  
  6. begin  
  7.   ATypeInfo := ADemo.ClassInfo;  
  8.   AClasDateInfo := GetTypeData(ATypeInfo);  
  9.   if AClasDateInfo.PropCount <> 0 then  
  10.   begin  
  11.   //分配空间  
  12.     GetMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);  
  13.   
  14.     try  
  15.       NumPro := GetPropList(ADemo.ClassInfo,[tkMethod],APropList);  
  16.       if NumPro <> 0 then  
  17.       begin  
  18.          mmo.Lines.Add('-----events-------');  
  19.          for I := 0 to NumPro - 1 do //获得事件属性的列表  
  20.          begin  
  21.            mmo.Lines.Add(Format('%s:%s',[APropList[i]^.Name,APropList[i]^.PropType^.Name]));  
  22.          end;  
  23.       end;  
  24.     finally  
  25.       FreeMem(APropList,sizeof(PPropInfo)*AClasDateInfo.PropCount);  
  26.     end;  
  27.   end;  
  28. end;  

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

Delphi代码  收藏代码
  1. var  
  2.   AProperInfo:PPropInfo;  
  3.   AValue:string;  
  4. begin  
  5.   AValue := GetPropValue(ADemo,'Name');  
  6.   mmo.Lines.Add('Name='+AValue);  
  7.   
  8.   AValue := GetPropValue(ADemo,'Age');  
  9.   mmo.Lines.Add('Age='+AValue);  
  10.   
  11.   SetPropValue(ADemo,'Name','zengzhen');  
  12.   SetPropValue(ADemo,'Age',100);  
  13.   AValue := GetPropValue(ADemo,'Name');  
  14.   mmo.Lines.Add('Name='+AValue);  
  15.   
  16.   AValue := GetPropValue(ADemo,'Age');  
  17.   mmo.Lines.Add('Age='+AValue);  
  18.     
  19. end;  

  输出:

Delphi代码  收藏代码
  1. Name=peirenlei  
  2. Age=0  
  3. Name=zengzhen  
  4. Age=100  

 http://peirenlei.iteye.com/blog/378465

原文地址:https://www.cnblogs.com/findumars/p/5236728.html