delphi - 如何获取自定义属性的属性类型名称?

标签 delphi rtti

在 Delphi 2007 中,我向我的项目添加了新的字符串类型:

type
  String40 = string;

该属性在类中使用:

type
  TPerson = class
  private
    FFirstName = String40;
  published
    FirstName: string40 read FFirstName write FFirstName;
  end;

在运行时,我想使用 RTTI 获取属性 FirstName 的名称。我希望它是 String40:

var
  MyPropInfo: TPropInfo;
  PropTypeName: string;
  MyPerson: TPerson;
begin
  MyPerson := TPerson.Create;
  MyPropInfo := GetPropInfo(MyPerson, 'FirstName')^;
  PropTypeName := MyPropInfo.PropType^.Name;

但是,在此示例中 PropTypeName 是“string”。我需要做什么才能获得正确的属性类型名称“String40”?

最佳答案

这在 Delphi5 中有效

type
  String40 = type string;

至于代码的其余部分,要使 RTTI 可用,您应该

  • 从 TPersistent 继承 TPerson 或
  • 对 TPerson 使用 {$M+} 编译器指令
  • 发布 Firstname 属性
<小时/>

编辑:如果编译并运行这段代码会发生什么?

program Project1;

uses
  Classes,
  typInfo,
  Dialogs,
  Forms;

{$R *.RES}

type
  String40 = type string;
  TPerson = class(TPersistent)
  private
    FFirstName: String40;
  published
    property FirstName: string40 read FFirstName write FFirstName;
  end;

var
  MyPropInfo: TPropInfo;
  PropTypeName: string;
  MyPerson: TPerson;

begin
  Application.Initialize;
  MyPerson := TPerson.Create;
  MyPropInfo := GetPropInfo(MyPerson, 'FirstName')^;
  PropTypeName := MyPropInfo.PropType^.Name;
  ShowMessage(PropTypeName);
end.

关于delphi - 如何获取自定义属性的属性类型名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/777125/

相关文章:

Delphi:是否可以枚举全局命名空间中记录的所有实例(~类型常量)?

delphi - RTTI:我可以通过名称获取类型吗?

c++ - 在 C++ 中混合 RTTI 标志

Delphi 自定义枚举器出现奇怪的错误

delphi - 将通用数组打印到控制台

sql-server-2005 - Delphi 应用程序使用 COMMIT 和 ROLLBACK 进行多个 SQL 更新

Delphi 7 将 XLS(X) 转换为 CSV

delphi - 如何获取访问该 Variant 的 Delphi 6 索引属性的基础原始 Variant 值?

delphi - 如何链接 "parallel"类层次结构?

delphi - 将 TStringList 传递给 TOmniTask 过程