Delphi2010的RTTI增强

转自我的旧博客

Delphi编译的文件体积增大了很多.很大一部分原因是因为Delphi2010默认提供了全信息的RTTI.

每一个数据类型都有全部运行时信息.例如可以在运行时获得结构体的成员以及成员类型等.

这个功能带来的方便就是我们可以写很多通用的序列化方法.也可以做一些类似OR的东西.

相反这个功能带来的缺点就是文件体积将增大.

不过有一个解决方案.就是把运行时信息的编译开关关掉.但是编译期间连接的库在Lib目录下.这些DCU文件却都是带RTTI信息的.所以编译出来 的内容也会是非常大的.就只有修改VCL源代码,全部关掉运行时信息的编译开关.然后把代码编译成DCU.放在LibNORTTI目录下.然后把 Delphi项目的Lib路径指向这里.就可以达到去掉RTTI信息缩小可执行文件体积的目的了.不过貌似CodeGear应该在Delphi上加上一个 选项,然后编译出两套VCL的DCU.根据不同选项连接不同目录下的DCU文件.我想CodeGear之所以没有这样做的原因应该是怕影响编译出来程序的 一致性吧.

好了我们初步探索一下增强的RTTI吧.说起来很简单.

第一步uses RTTI;

然后照搬模式:

var
r : TRttiContext;
begin
r := TRttiContext.Creat();

写获取RTTI信息的代码

r.Free;
end;

TRttiContext的方法

GetTypes是获取系统内全部类型的类型信息数组.返回值类型是TArray<TRttiType>.(用到了从Delphi2009以来增加的泛型)

FindType是按名字找查找类型信息.

GetPackages是返回运行时包

GetType有两个重载方法.

function GetType(ATypeInfo: Pointer): TRttiType; overload;可以返回任何指定类型的类型嘻嘻
function GetType(AClass: TClass): TRttiType; overload;仅仅对Class有效.

下面就举个例子:

type
TTestRecord = record
a:string;
b:Integer;
c:Double;
end;

TTestClass = class
private
a:string;
b:Integer;
c:Double;
end;

var
r : TRttiContext;
rt : TRttiType;
f : TRttiField;
begin
r := TRttiContext.Create();
rt := r.GetType(TTestClass);
for f in rt.GetFields() do
begin
OutputDebugString(PChar(Format(‘%s.%s:%s’,[rt.Name, f.Name, f.FieldType.Name])));
end;

r.Free;
end;

在Delphi的EventLog中就可以看到TTestClass的成员,不关它是私有还是公有的.

结构体和其他类型则可以用function GetType(ATypeInfo: Pointer): TRttiType;这个方法,当然这个方法也可以处理Class类型

所区别就在于要加上TypeInfo操作符取回类型信息指针.

var
r : TRttiContext;
rt : TRttiType;
f : TRttiField;
begin
r := TRttiContext.Create();
rt := r.GetType(TypeInfo(TTestClass));
for f in rt.GetFields() do
begin
OutputDebugString(PChar(Format(‘%s.%s:%s’,[rt.Name, f.Name, f.FieldType.Name])));
end;

rt := r.GetType(TypeInfo(TTestRecord));
for f in rt.GetFields() do
begin
OutputDebugString(PChar(Format(‘%s.%s:%s’,[rt.Name, f.Name, f.FieldType.Name])));
end;

r.Free;
end;

此条目发表在Delphi, 未分类分类目录。将固定链接加入收藏夹。

Delphi2010的RTTI增强》有55条回应

  1. Pingback引用通告: psixolog

  2. Pingback引用通告: Coronavirus real-time updates

  3. Pingback引用通告: PSYCHOSOCIAL

  4. Pingback引用通告: Cherekasi

  5. Pingback引用通告: Film Doktor Liza (2020)

  6. Pingback引用通告: film djoker

  7. Pingback引用通告: viagra

  8. Pingback引用通告: Îíëàéí Ïñèõîëîã

  9. Pingback引用通告: generic viagra

  10. Pingback引用通告: viagra price

  11. Pingback引用通告: buy viagra online

  12. Pingback引用通告: viagra pill

  13. Pingback引用通告: otc viagra

  14. Pingback引用通告: generic cialis

  15. Pingback引用通告: cialis online

  16. Pingback引用通告: cialis price

  17. Pingback引用通告: buy cialis online

  18. Pingback引用通告: rlowcostmd.com

  19. Pingback引用通告: bitly.com

  20. Pingback引用通告: Earthlings 2005

  21. Pingback引用通告: viagra 100mg

  22. Pingback引用通告: smotret onlajn besplatno v kachestve hd 1080

  23. Pingback引用通告: movies-unhinged-film

  24. Pingback引用通告: Dom 2

  25. Pingback引用通告: zoom-psykholog

  26. Pingback引用通告: Cherkassy 2020

  27. Pingback引用通告: chernobyl-hbo-2020-1-sezon-2-sezon

  28. Pingback引用通告: moskva-psiholog

  29. Pingback引用通告: batmanapollo.ru

  30. Pingback引用通告: 323

  31. Pingback引用通告: dom2 ru

  32. Pingback引用通告: psy psy psy psy

  33. Pingback引用通告: krsmi.ru

  34. Pingback引用通告: HD

  35. Pingback引用通告: groznyy-serial-2020

  36. Pingback引用通告: bitly.com/eternals-online

  37. Pingback引用通告: dzhonuikfilm4

  38. Pingback引用通告: bitly.com/venom-2-smotret-onlajn

  39. Pingback引用通告: bitly.com/1dreykfilm

  40. Pingback引用通告: Human design

  41. Pingback引用通告: 1444

  42. Pingback引用通告: cleantalkorg2.ru

  43. Pingback引用通告: vk login

  44. Pingback引用通告: svaty—7—sezon

  45. Pingback引用通告: tiktok

  46. Pingback引用通告: The Revenant 2021

  47. Pingback引用通告: 00-tv.com

  48. Pingback引用通告: Human Design 2021

  49. Pingback引用通告: psy

  50. Pingback引用通告: psy2022

  51. Pingback引用通告: projectio freid

  52. Pingback引用通告: kinoteatrzarya.ru

  53. Pingback引用通告: video

  54. Pingback引用通告: top

  55. Pingback引用通告: soderzhanki-3-sezon-2021.online

评论已关闭。