热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Delphi下获取RTTI信息源代码

procedureGetBaseClassInfo(AClass:TObject;AStrings:TStrings);{Thismethodobtai

 

procedure GetBaseClassInfo(AClass: TObject; AStrings: TStrings);
{ This method obtains some basic RTTI data from the given 
object  and adds that
  information to the AStrings parameter. }
var
  ClassTypeInfo: PTypeInfo;
  ClassTypeData: PTypeData;
  EnumName: String;
begin
  ClassTypeInfo :
=  AClass.ClassInfo;
  ClassTypeData :
=  GetTypeData(ClassTypeInfo);
  with AStrings 
do
  begin
    Add(Format(
' Class Name:     %s ' , [ClassTypeInfo.Name]));
    EnumName :
=  GetEnumName(TypeInfo(TTypeKind), Integer(ClassTypeInfo.Kind));
    Add(Format(
' Kind:           %s ' , [EnumName]));
    Add(Format(
' Size:           %d ' , [AClass.InstanceSize]));
    Add(Format(
' Defined in:     %s.pas ' , [ClassTypeData.UnitName]));
    Add(Format(
' Num Properties: %d ' ,[ClassTypeData.PropCount]));
  end;
end;

 

 

procedure GetClassProperties(AClass: TObject; AStrings: TStrings);
{ This method retrieves the property names and types 
for  the given  object
  and adds that information to the AStrings parameter. }
var
  PropList: PPropList;
  ClassTypeInfo: PTypeInfo;
  ClassTypeData: PTypeData;
  i: integer;
  NumProps: Integer;
begin

  ClassTypeInfo :
=  AClass.ClassInfo;
  ClassTypeData :
=  GetTypeData(ClassTypeInfo);

  
if  ClassTypeData.PropCount  <>   0  then
  begin
    
//  allocate the memory needed to hold the references to the TPropInfo
    
//  structures on the number of properties.
    GetMem(PropList, SizeOf(PPropInfo)  *  ClassTypeData.PropCount);
    
try
      
//  fill PropList with the pointer references to the TPropInfo structures
      GetPropInfos(AClass.ClassInfo, PropList);
      
for  i : =   0  to ClassTypeData.PropCount  -   1   do
        
//  filter out properties that are events ( method pointer properties)
         if  not (PropList[i] ^ .PropType ^ .Kind  =  tkMethod) then
          AStrings.Add(Format(
' %s: %s ' , [PropList[i] ^ .Name, PropList[i] ^ .PropType ^ .Name]));

      
//  Now get properties that are events (method pointer properties)
      NumProps : =  GetPropList(AClass.ClassInfo, [tkMethod], PropList);
      
if  NumProps  <>   0  then begin
        AStrings.Add(
'' );
        AStrings.Add(
'    EVENTS   ================  ' );
        AStrings.Add(
'' );
      end;
      
//  Fill the AStrings with the events. 
       for  i : =   0  to NumProps  -   1   do
          AStrings.Add(Format(
' %s: %s ' , [PropList[i] ^ .Name, PropList[i] ^ .PropType ^ .Name]));

    
finally
      FreeMem(PropList, SizeOf(PPropInfo) 
*  ClassTypeData.PropCount);
    end;
  end;

end;

 

 运用Delphi 的 RTTI可以实现 Java 与 C# 下的反射机制,只是大家在Delphi 下做 RAD开发做多了,没有关注到这些关键的技术,接下来会写一个Delphi 下的OR Mapping框架,到时候会与大家分享。


推荐阅读
author-avatar
狮子胯下
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有