7

System.TypInfo.TPropInfo 有两个函数成员(至少在 D-XE3 中):

function NameFld: TTypeInfoFieldAccessor; inline;
function Tail: PPropInfo; inline;

我找不到它们的任何文档或任何使用它们的示例。它们的用途是什么以及如何使用它们?(希望这是一个问题。)

4

1 回答 1

3

NameFld 函数将属性的名称作为TTypeInfoFieldAccessor.

这允许您执行以下操作:

MyPropertyName:= MyPropInfo.NameFld.ToString;
if (PropInfoA.NameFld = PropInfoB.NameFld) then begin 
  writeln('property names are the same');
end;

TTypeInfoFieldAccessor在内部将属性的名称存储在短字符串中。
因为 NextGen 编译器不支持短字符串,所以使用了一个PByte类型。
(我猜作者不想用 ifdefs 乱扔源代码并撕掉 PShortstring 引用)

的输入Tail是一个指向内部短字符串长度字段的 PByte。

这是tail的源代码。

function TTypeInfoFieldAccessor.Tail: PByte;
begin
  Result:= 
    FData    //Start of the shortstring 
    + FData^ + //Length of the stringData
    + 1; //Add one for the length byte itself
end;

因为短字符串不是以空字符结尾的,所以不能执行简单的“循环直到找到空字符”类型的循环。
因此,可以使用从头到尾的循环将短字符串转换为普通字符串。
奇怪的是,在实际的 RTL 源代码中,到处都使用长度字节而不是tail函数;所以它看起来像一个剩菜。
包含一个size函数并删除tail.

于 2014-07-26T15:39:27.013 回答