[C# - VS 2008] Cómo crear atributos personalizados para Enumerados

Los enumerados son listas constantes agrupables que por defecto empiezan en 0 y que una utilidad es que facilitan a nivel de desarrollo evitar que se pasen valores fuera de rango a objetos, o dato basura, evitar escribir código de validación del parámetro que estamos recibiendo, para encontrar más información básica sobre enumerados aquí, pero cuando trabajamos con enumerados puede darse el caso de que necesitemos extraer su valor equivalente en string y no entero, por ejemplo que para si queremos representar en nuestro sistema un objeto WorkFlowType cuyo valor lo debe extraer de MOSS 2007 en español, pues para este caso como entrada y salida de nuestro sistema necesitamos que el enumerado represente a un string, pues para este caso podemos utilizar un atributo personalizable (ValorString) para poder representar el enumerado de la siguiente manera:


[Serializable]


public enum WorkFlowType


{


[ValorString("Ninguno")]


Empty,


[ValorString("En Serie")]


Serial,


[ValorString("En Paralelo")]


Parallel


};


 


Para que este código funcione y el compilador no les retorne un error lo que se debe hacer es escribir una clase que represente a un atributo, para esto la clase debe:


  • Heredar de la clase Attribute del espacio de nombres System.
  • Debe contener un campo de tipo string, el constructor debe recibir un string para inicializar el campo, y una propiedad de sólo lectura que retorne el valor que contiene el campo.

La clase completa es:


[Serializable]


public class AtributoValorString : System.Attribute


{


#region Fields


private string _valor;


#endregion


 


#region Constructor


public AtributoValorString(string parametro)


{


_valor = parametro;


}


#endregion


 


#region Properties


public string ValorString


{


get { return _valor; }


}


#endregion


}


Para finalizar debemos crear un nuevo método extendido (Extension Method – Nueva característica de lenguaje C# en VS 2008), no olviden agregar el namespace reflection:


using System.Reflection;


 


[Serializable]


public static class Utilitarios


{


public static string ObtenerValorString(this Enum value)


{


// Obtiene el tipo


Type type = value.GetType();


 


// Obtiene el fieldinfo para este tipo


FieldInfo fieldInfo = type.GetField(value.ToString());


 


// Obtiene el atributo ValorString


AtributoValorString [] attribs = fieldInfo.GetCustomAttributes(


typeof(AtributoValorString), false) as AtributoValorString[];


 


// Retorna el primer elemento.


return attribs.Length > 0 ? attribs[0].StringValue : null;


}


}


 


Cuando utilicemos el enumerado ahora veremos que podemos utilizar el método extendido que acabamos de crear:


WorkFlowType.Serial.ObtenerValorString()

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>