Delphi 2010引入了可以添加到类型声明和方法的自定义属性。哪个语言元素可以使用自定义属性?
到目前为止我找到的例子包括类声明,字段和方法。 (而AFAIK泛型类不支持自定义属性)。
this article中显示了一些示例。看起来变量(任何类声明的外部)也可以具有属性。
根据这篇文章,属性可以用于
是否还有可以放置属性的其他语言元素?
更新:本文指出自定义属性可以放在属性之前: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;
我想还有一种方法可以读取方法参数的属性,比如
procedure Request([FormParam] AUsername: string; [FormParam] APassword: string);
答案 0 :(得分: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.
问题是检索这些自定义属性。查看rtti.pas
单元,可以检索自定义属性:
TRttiRecordType
)TRttiInstanceType
)TRttiMethodType
)TRttiPointerType
) - 用于什么?TRttiProcedureType
)无法为“单元”级别或局部变量和过程检索任何类型的RTTI,因此无法检索有关属性的信息。