martes, 16 de marzo de 2010

Enumerados con valores de tipo cadena C#

Fuera de toda duda estan las ventajas de utilizar enumerados en nuestro código, pero en ocasiones es necesario asociar el valor del enumerado con una cadena, en .Net no se permiten enumerados con valores númericos pero... hace tiempo encontre una solución que ahroa voy a presentar.
/// 
    /// Se crea una clase que hereada de Attribute
    /// esta clase almacenara el string con el valor
    /// del enumerado
    /// 
    public class StringValueAttribute : Attribute {

        #region Properties

        /// 
        /// Holds the stringvalue for a value in an enum.
        /// 
        public string StringValue { get; protected set; }

        #endregion

        #region Constructor

        /// 
        /// Constructor used to init a StringValue Attribute
        /// 
        /// 
        public StringValueAttribute(string value) {
            this.StringValue = value;
        }

        #endregion

    }
Ahora es necesario crear un Método de extension para poder obtener el string asociado al valor del enumerado.
/// 
        /// Se obtiene la cadena asociada
        /// a un valor concreto del enumerado,esto solo funciona 
        /// si se ha asignado previamente un valor al atributo StringValue
        /// 
        /// 
        /// 
        public static string GetStringValue(this Enum value) {
            // Get the type
            Type type = value.GetType();

            // Get fieldinfo for this type
            FieldInfo fieldInfo = type.GetField(value.ToString());

            // Get the stringvalue attributes
            StringValueAttribute[] attribs = fieldInfo.GetCustomAttributes(
                typeof(StringValueAttribute), false) as StringValueAttribute[];

            // Return the first if there was a match.
            return attribs.Length > 0 ? attribs[0].StringValue : null;
        }
Ahora vemos como crear un enumerado
 public enum MyEnum: int {
        [StringValue("Lun")]
        Lunes= 1,
        [StringValue("Mar")]
        Martes = 2       
 } 
Como parte final vemos como usar nuestro enumerado.
MyEnum myE = MyEnum.Lunes;
string val = myE.GetStringValue();

1 comentario:

chimbera dijo...

Hola,
yo he probado esto y no me funciona.
¿podrías poner un ejemplo completo de contexto para ver su uso?