Atributos


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.

Anuncios

Un comentario en “Atributos”

Comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s