Existen en .Net clases especiales que agregan indicadores funcionales a distintas partes del código, como Clases, métodos, propiedades, etc.
La intención de los mismos es permitir indicar características especiales a dichos elementos, como por ejemplo, en el caso de propiedades de controles, si son editables en tiempo de diseño, si se permite al usuario modificarlas, entre otras.
Otro ejemplo es la indicación de funcionalidades específicas, como por ejemplo, en un enumerador, cuando éste debe comportarse como “Mapa de bits” (atributo Flags).
Una característica interesante del propio .Net Framework es que es posible definir Atributos personalizados.
Se trata sencillamente de crear una clase que herede de System.Attribute
Los estándares de nomenclatura de .net Framework indican que el nombre de la clase debe terminar con Attribute. (Llamativamente, durante su utilización, esa parte del nombre no es necesaria). Por Ejemplo:
DataFieldAttribute
Por lo demás,al igual que cualquier otra clase, pueden tener propiedades, métodos, constructores, etc. aunque normalmente, no se implementa código ejecutable, si es posible hacer uso de los mismos con propiedades que definan características específicas de aquello a lo cual queremos aplicarle el atributo.
En el siguiente ejemplo, se define un atributo específico para propiedades, que indica que la misma se corresponde con un campo específico de una tabla de base de datos.Inclusive, en forma opcional, se podrá indicar que valor predeterminado utiliza (usando un enumerador).
Veamos el código,y luego analizaremos algunos detalles.
VB
Imports System.Runtime.CompilerServices <AttributeUsage(AttributeTargets.[Property] Or AttributeTargets.Field, Inherited:=False, AllowMultiple:=False)> _ Public Class DataFieldAttribute Inherits Attribute Public Property ColumnName() As String Get Return m_ColumnName
End Get Set(value As String)
m_ColumnName = value
End Set End Property Private m_ColumnName As String Public Property DefaultValue() As DefaultValueEnum Get Return m_DefaultValue
End Get Set(value As DefaultValueEnum)
m_DefaultValue = value
End Set End Property Private m_DefaultValue As DefaultValueEnum Public Sub New(<CallerMemberName> Optional columnName As [String] = "", Optional defaultValue As DefaultValueEnum = DefaultValueEnum.None)
Me.ColumnName = columnName
Me.DefaultValue = defaultValue
End Sub End Class Public Enum DefaultValueEnum Now
AutoIncrement
None End Enum
C#
using System; using System.Runtime.CompilerServices; namespace DS.Common {
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, Inherited = false, AllowMultiple = false)] public class DataFieldAttribute : Attribute {
public string ColumnName
{
get { return m_ColumnName; }
set { m_ColumnName = value; }
}
private string m_ColumnName;
public DefaultValueEnum DefaultValue
{
get { return m_DefaultValue; }
set { m_DefaultValue = value; }
}
private DefaultValueEnum m_DefaultValue;
public DataFieldAttribute([CallerMemberName()] String columnName = "", DefaultValueEnum defaultValue = DefaultValueEnum.None)
{
this.ColumnName = columnName;
this.DefaultValue = defaultValue;
}
}
public enum DefaultValueEnum {
Now,
AutoIncrement,
None
} }
Puntos importantes.
- La clase hereda efectivamente de Attribute. A su vez, tiene asignado un atributo indicando que puede aplicarse a Propiedades y/o Campos. Además, que sólo puede aplicarse una vez en cada propiedad o campo.
- Posee propiedades ColumnName y DefaultValue
- DefaultValue es de un tipo también definido en el código, el enumerador DefaultValueEnum
- Finalmente,el constructor admite dos argumentos, columnName y defaultValue, respectivamente, para asignar a las propiedades correspondientes.
- Ambos parámetros son opcionales. Para el valor predeterminado se asigna None, y para el nombre de la columna, una cadena vacía.
- Sin embargo, en caso deno indicarse un valor cuando se instancia el atributo, el mismo usa una funcionalidad del compilador, el atributo CallerMemberName, que permite asignar el valor del elemento que lo llama (en este caso, el nombre de la propiedad o el campo), en lugar de la cadena vacía, con lo cual, en ningún caso tendría un valor vacío.
Espero pronto poder, finalmente, combinar distintos elementos que vimos, para crear algo más funcional.
Nos vemos pronto.
Un comentario en “Atributos”