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

mjn*_*mjn 30 delphi annotations delphi-2010 delphi-xe delphi-xe2

Delphi 2010引入了可以添加到类型声明和方法的自定义属性.哪个语言元素可以使用自定义属性?

到目前为止我找到的例子包括类声明,字段和方法.(而AFAIK泛型类不支持自定义属性).

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

根据这篇文章,可以使用属性

  • 类和记录字段和方法
  • 方法参数
  • 性能
  • 非本地枚举声明
  • 非局部变量声明

是否有其他语言元素可以放置属性?


更新:本文指出自定义属性可以放在属性之前:http://francois-piette.blogspot.de/2013/01/using-custom-attribute-for-data.html

它包含以下代码示例:

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;
Run Code Online (Sandbox Code Playgroud)

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

procedure Request([FormParam] AUsername: string; [FormParam] APassword: string);
Run Code Online (Sandbox Code Playgroud)

Cos*_*und 25

有趣的问题!你可以在几乎任何东西上声明属性,问题是使用RTTI检索它们.这是一个快速控制台演示,用于声明自定义属性:

  • 枚举
  • 功能类型
  • 程序类型
  • 方法类型(of object)
  • 别名类型
  • 记录类型
  • 班级类型
  • 记录类的内部类型
  • 记录字段
  • 记录方法
  • 类实例字段
  • class字段(class var)
  • 类方法
  • 全局变量
  • 全球功能
  • 局部变量

没有找到为类声明自定义属性的property方法.但是可以将自定义属性附加到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.
Run Code Online (Sandbox Code Playgroud)

问题是检索这些自定义属性.查看rtti.pas单元,可以检索自定义属性:

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

无法为"单元"级别或局部变量和过程检索任何类型的RTTI,因此无法检索有关属性的信息.

  • 不支持属性上的属性是奇怪的(而且很遗憾 - 属性是关于Delphi类的一个很棒的东西.)顺便说一下,+1是一个很好的答案. (2认同)
  • @David M:看看我的更新,看起来属性上的属性工作得很好 (2认同)