software - programacion delphi ejemplos
¿Qué elementos del lenguaje se pueden anotar utilizando la función de lenguaje de atributos de Delphi? (1)
Delphi 2010 introdujo atributos personalizados que se pueden agregar a declaraciones y métodos de tipo. ¿Para qué elementos del lenguaje se puede usar un atributo personalizado?
Los ejemplos que he encontrado hasta ahora incluyen declaraciones de clase, campos y métodos. (Y las clases genéricas AFAIK no admiten atributos personalizados).
Algunos ejemplos se muestran en este artículo . Parece que las variables (externas a cualquier declaración de clase) también pueden tener atributos.
Según este artículo, los atributos se pueden usar para
- campos y métodos de clase y registro
- parámetros del método
- propiedades
- declaraciones de enumeración no locales
- declaraciones de variables no locales
¿Hay otros elementos de idioma donde se pueden colocar los atributos?
Actualización: este artículo indica que los atributos personalizados se pueden colocar antes de las propiedades: http://francois-piette.blogspot.de/2013/01/using-custom-attribute-for-data.html
Contiene este ejemplo de código:
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;
Supongo que también hay una forma de leer atributos en argumentos de métodos como
procedure Request([FormParam] AUsername: string; [FormParam] APassword: string);
¡Interesante pregunta! Puede declarar atributos en casi cualquier cosa , el problema es recuperarlos usando RTTI. Aquí hay una demostración rápida de la consola para declarar atributos personalizados para:
- Enums
- Tipo de función
- Tipo de procedimiento
- Tipo de método (
of object
) - Tipo de alias
- Tipo de registro
- Tipo de clase
- Tipo de registro interno de una clase
- Campo de registro
- Método de registro
- Campo de instancia de clase
- Campo clase
class
(class var
) - Método de clase
- Variable global
- Función global
- Variable local
No encontré una forma de declarar un atributo personalizado para una property
de una clase. Pero un atributo personalizado se puede adjuntar a los métodos getter o setter.
Código, la historia continúa después del código:
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.
El problema es recuperar esos atributos personalizados. Mirando la unidad rtti.pas
, los atributos personalizados pueden ser recuperados para:
- Tipo de registro (
TRttiRecordType
) - Tipo de instancia (
TRttiInstanceType
) - Tipo de método (
TRttiMethodType
) - Tipo de puntero (
TRttiPointerType
): ¿para qué se usa? - Tipo de procedimiento (
TRttiProcedureType
)
No hay forma de recuperar ningún tipo de RTTI para nivel de "unidad" o variables y procedimientos locales, por lo tanto, no hay forma de recuperar información sobre los atributos.