哪些语言元素可以使用Delphi的属性语言功能进行注释?

哪些语言元素可以使用Delphi的属性语言功能进行注释?,delphi,annotations,delphi-2010,delphi-xe,delphi-xe2,Delphi,Annotations,Delphi 2010,Delphi Xe,Delphi Xe2,Delphi2010引入了可添加到类型声明和方法中的自定义属性。自定义属性可以用于哪些语言元素 到目前为止,我发现的示例包括类声明、字段和方法。(和AFAIK泛型类不支持自定义属性) 中显示了一些示例。看起来变量(任何类声明的外部)也可以有属性 基于本文,属性可以用于 类和记录字段及方法 方法参数 性质 非局部枚举声明 非局部变量声明 是否有其他可以放置属性的语言元素 更新:本文指出可以将自定义属性置于属性之前: 它包含以下代码示例: type TConfig = class(TCom

Delphi2010引入了可添加到类型声明和方法中的自定义属性。自定义属性可以用于哪些语言元素

到目前为止,我发现的示例包括类声明、字段和方法。(和AFAIK泛型类不支持自定义属性)

中显示了一些示例。看起来变量(任何类声明的外部)也可以有属性

基于本文,属性可以用于

  • 类和记录字段及方法
  • 方法参数
  • 性质
  • 非局部枚举声明
  • 非局部变量声明
是否有其他可以放置属性的语言元素


更新:本文指出可以将自定义属性置于属性之前:

它包含以下代码示例:

type
  TConfig = class(TComponent)
  public
    [PersistAs('Config', 'Version', '1.0')]
    Version : String;
    [PersistAs('Config', 'Description', 'No description')]
    Description : String;
    FTest : Integer;
    // No attribute => not persistent
    Count : Integer;
    [PersistAs('Config', 'Test', '0')]
    property Test : Integer read FTest write FTest;
  end;

我想还有一种方法可以读取方法参数的属性,比如

procedure Request([FormParam] AUsername: string; [FormParam] APassword: string);

有趣的问题!您几乎可以在任何东西上声明属性,问题是使用RTTI检索属性。下面是一个为以下对象声明自定义属性的快速控制台演示:

  • 列举
  • 功能类型
  • 程序类型
  • 对象的方法类型(
  • 别名类型
  • 记录类型
  • 类类型
  • 类内部的记录类型
  • 记录字段
  • 记录方法
  • 类实例字段
  • 字段(
    类变量
  • 类方法
  • 全局变量
  • 全局函数
  • 局部变量
找不到为类的
属性
声明自定义属性的方法。但是可以将自定义属性附加到getter或setter方法

代码,故事在代码之后继续:

program Project25;

{$APPTYPE CONSOLE}

uses
  Rtti;

type
  TestAttribute = class(TCustomAttribute);

  [TestAttribute] TEnum = (first, second, third);
  [TestAttribute] TFunc = function: Integer;
  [TestAttribute] TEvent = procedure of object;
  [TestAttribute] AliasInteger = Integer;

  [TestAttribute] ARecord = record
    x:Integer;
    [TestAttribute] RecordField: Integer;
    [TestAttribute] procedure DummyProc;
  end;

  [TestAttribute] AClass = class
  strict private
    type [TestAttribute] InnerType = record y:Integer; end;
  private
    [TestAttribute]
    function GetTest: Integer;
  public
    [TestAttribute] x: Integer;
    [TestAttribute] class var z: Integer;
    // Can't find a way to declare attribute for property!
    property Test:Integer read GetTest;
    [TestAttribute] class function ClassFuncTest:Integer;
  end;

var [TestAttribute] GlobalVar: Integer;

[TestAttribute]
procedure GlobalFunction;
var [TestAttribute] LocalVar: Integer;
begin
end;

{ ARecord }

procedure ARecord.DummyProc;
begin
end;

{ AClass }

class function AClass.ClassFuncTest: Integer;
begin
end;

function AClass.GetTest: Integer;
begin
end;

begin
end.
问题在于检索这些自定义属性。查看
rtti.pas
单元,可以为以下对象检索自定义属性:

  • 记录类型(
    TRttiRecordType
  • 实例类型(
    TRttiInstanceType
  • 方法类型(
    TRttiMethodType
  • 指针类型(
    trttiponertype
    )-用于什么
  • 程序类型(
    TRttiProcedureType

对于“单元”级或局部变量和过程,无法检索任何类型的RTTI,因此无法检索有关属性的信息。

+1个有趣的问题。文档中说属性是for-我怀疑这意味着
type
子句中的任何内容,以及记录或类(成员变量、属性、函数、过程、内部类等)中声明的任何内容,这些内容与属性相关联的链接对我不起作用。如果您还记得上面所说的,您是否介意编辑下面的答案,以演示属性在属性上的使用?(我找不到该链接的其他来源,因为引用不包括任何关于作者、主题、论坛甚至日期的内容。)@RobKennedy感谢您的关注!我找不到原始来源,但另一篇文章和更新的问题不支持属性是奇怪的(遗憾的是,属性是Delphi类最棒的东西之一。)顺便说一句,+1是一个很好的答案。@David M:请看我的更新,看起来属性上的属性很好,那么过程和函数参数呢,它们可以有属性吗?