Delphi 是否可以获取类属性的索引?

Delphi 是否可以获取类属性的索引?,delphi,properties,Delphi,Properties,是否可以获取类属性的索引?比如说 type TMyClass = class ... public ... property P1: Integer Index 1 read GetInteger write SetInteger; property P2: Integer Index 2 read GetInteger write SetInteger; property P3: Integer Index 3 read GetInteger wri

是否可以获取类属性的索引?比如说

type
  TMyClass = class
  ...
  public
    ...
    property P1: Integer Index 1 read GetInteger write SetInteger;
    property P2: Integer Index 2 read GetInteger write SetInteger;
    property P3: Integer Index 3 read GetInteger write SetInteger;
    ...
  end;

您可以使用RTTI获取属性的索引。根据您的Delphi版本,您可以使用
GetPropInfo
方法(仅适用于已发布的属性)或通过
TrtInstanceProperty
类访问此类信息

试试这个样品

  I := IndexOfProperty(TMyClass.P2);

属性的RTTI包含索引。您的属性被声明为
public
,因此无法通过
TypInfo
单元提供的老式RTTI访问这些属性。但是,可通过
RTTI
装置(仅限D2010及更高版本)提供的较新样式的RTTI进行访问:

如果您的属性被声明为已发布,那么您可以使用
TypInfo
RTTI:

uses
  Rtti;

var
  Ctx: TRttiContext;
  I: Integer;
begin
  Ctx := TRttiContext.Create;
  I := (Ctx.GetType(TMyClass).GetProperty('P2') as TRttiInstanceProperty).Index;
end;

@Jerrydoge-我需要公共属性的索引。使用
GetPropInfo()
不需要创建类的实例。可以传递类类型而不是对象指针。另外,
trttInstanceProperty
有自己的
Index
属性,您不需要使用
PropInfo.Index
。您提到了“(仅用于发布的属性)”,但示例是公共属性…@jerrydoge,我知道,OP必须修改类并将属性声明为已发布,才能使用
GetPropInfo
函数。@PRUZ-我还有一个问题。请看,但他可以使用$RTTI pragma来公开TypeInfo也涵盖的财产,不是吗?@Remy Lebeau-我还有一个问题。请参阅@Arioch'The-Delphi XE4,
{$RTTI显式方法([vcPublic,vcpublisted])属性([vcPublic,vcpublisted])}
但是
GetPropInfo()
不适用于公共道具@布兰科,如果我知道。。。就我个人而言,我根本无法枚举类属性!
uses
  Rtti;

var
  Ctx: TRttiContext;
  I: Integer;
begin
  Ctx := TRttiContext.Create;
  I := (Ctx.GetType(TMyClass).GetProperty('P2') as TRttiInstanceProperty).Index;
end;
uses
  TypInfo;

var
  I: Integer;
begin
  I := GetPropInfo(TMyClass, 'P2').Index;
end;