Los atributos de .NET resuelven todos estos problemas y ofrecen una forma dinámica y estándar para asociar información adicional con piezas especificas de código. En la práctica, los atributos nos permiten extender los metadatos asociados con un ensamblado, una clase o un método. Lenguajes diferentes utilizan una sintaxis ligeramente distinta para los atributos, pero hay un mecanismo unificado, denominado reflexión, para recuperar todos los atributos asociados con un fragmento de código. Mejor aún, los atributos en sí son un tipo de datos y es posible definir atributos personalizados con la simple creación de una clase nueva que se herede de System.Attribute.
Podemos considerar a los atributos como anotaciones que intercalamos en nuestro código. Es posible aplicar atributos a casi cualquier entidad de programación que soporta Delphi Prism, incluidas las clases, registros, propiedades, métodos y enumeraciones. No todos los atributos pueden aplicarse a todas las entidades, pero la sintaxis general que se emplea para insertarlos es consistente en cada lenguaje de .NET. Por ejemplo, todos los atributos de Delphi Prism requieren una sintaxis idéntica, que es diferente de la sintaxis de C# o Visual Basic .NET.
Bajo Delphi Prism un atributo se encierra ente corchetes ([ ]) y se inserta antes del elemento al que se hace referencia. Por ejemplo, podemos aplicar System.ComponentMo- del.DescriptionAttribute a una clase como sigue:
delphi
type [System.ComponentModel.Description('Persona')] TPersona = public class private public end;
Existen muchas maneras de simplificar la sintaxis de un atributo. En primer lugar, los atributos son clases del .NET; por tanto, podemos escribir un nombre más corto si agregamos el nombre de espacio a la sección uses. En segundo lugar, las directrices de .NET dictan que los nombres de todas las clases de atributo terminen con la palabra Attribute, pero casi todos los compiladores de .NET entre ellos Delphi Prism, C# y VB.NET, nos permiten quitar el sufijo Attribute del nombre. Después de seguir estas reglas nuestro ejemplo inicial se convierte en:
delphi
type [Description('Persona')] TPersona = public class private end;
Los atributos son clases del .NET muy peculiares. Soportan propiedades y métodos, pero no pueden hacer referencia a ellas en el código como lo haríamos con clases comunes. En realidad, sólo podemos asignar una o más propiedades cuando creamos el atributo, y esas propiedades no cambian durante la vida de la aplicación.
En realidad, el fragmento de código anterior es una llamada al método constructor del atributo Description, que toma como argumento el valor de la propiedad Description. Una vez que se ha establecido este calor, no se modifica ni utiliza (por lo menos no lo hace la aplicación que usa el atributo). Sin embargo, una aplicación externa, como el compilador o el .NET Framework, puede utilizar las propiedades de atributos específicos, con el uso de la reflexión. Debido a su naturaleza, es muy raro que las clases adicionales no necesarias tengan otro método que el constructor.
Un atributo del método constructor toma o no argumentos. También puede tomar argumentos opcionales con nombre, que permiten establecer propiedades adicionales no necesarias en el constructor y se pasan en la forma nombre:= valor.
Por ejemplo, WebMethodAttribute requiere argumentos con nombre opcionales porque expone más propiedades de la que puede establecer con su constructor:
delphi
[WebMethod(true,Description:='Operacion de suma',CacheDuration:=60)] method Suma(n1 : Double;n2 : Double) : Double;
Casi todos los atributos están estrechamente relacionados con características específicas del motor en tiempo de ejecución del .NET. Por ello, tiene, más sentido analizar atributos específicos sólo en el capítulo donde explico esas características.
Podemos aplicar varios atributos a la misma entidad de código separándolos con una coma:
delphi
[Serializable(), Description('Persona')] TPersona = public class private public [WebMethod(true,Description:='Operacion de suma',CacheDuration:=60)] method Suma(n1 : Double;n2 : Double) : Double; end;
Profundizaremos mas sobre atributos en el capitulo “Atributos Personalizadosâ€