;

quinta-feira, 27 de janeiro de 2011

Usando enums com string value

Muitas vezes quando criamos enums no C#, temos a necessidade de atribuir nomes compostos aos itens desta enumeração. Porém, ao declarar qualquer tipo de dado em C#, não podemos dar um nome que contenha espaços e caracteres especiais. E a boa prática recomenda que não se use acentos em nomes de variáveis e tipos declarados. Porém existe uma forma bem interessante de se associar strings ao valor de uma enum, usando reflection. Vou mostrar um exemplo para ficar mais claro.

Para começar, criamos uma enum. Nesta enum, para cada item que quisermos associar uma string, utilizaremos a classe DescriptionAttribute, do C#, assim:

public enum Status_Pedido
{       
    Aberto,
    [DescriptionAttribute("Aguardando expedição")]
    AguardExpedicao,
    [DescriptionAttribute("Aguardando confirmação")]
    AguardConfirmacao,
    Encerrado
}

Criada a enum , criaremos agora uma classe com os métodos para a recuperação destas strings. Criaremos o método stringValueOf, que receberá o item da enum e retornará a string associada a ele. Criaremos também o método enumValueOf, que receberá a string associada e o tipo da enum, e retornará um object, representando o item da enum. Veja como fica:

public class EnumUtils
{
    public static string stringValueOf(Enum value)
    {
        System.Reflection.FieldInfo fi = value.GetType().GetField(value.ToString());
        System.ComponentModel.DescriptionAttribute[] attributes = (System.ComponentModel.DescriptionAttribute[])fi.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false);
        if (attributes.Length > 0)
        {
            return attributes[0].Description;
        }
        else
        {
            return value.ToString();
        }
    }

    public static object enumValueOf(string value, Type enumType)
    {
        string[] names = Enum.GetNames(enumType);
        foreach (string name in names)
        {
            if (stringValueOf((Enum)Enum.Parse(enumType, name)).Equals(value))
            {
                return Enum.Parse(enumType, name);
            }
        }

        throw new ArgumentException("The string is not a description or value of the specified enum.");
    }
}

E já está pronto. Agora é só usar a classe e os métodos criados. Por exemplo, desta forma:

Console.WriteLine(EnumUtils.enumValueOf("Aguardando expedição", typeof(Status_Pedido)).ToString());
Console.WriteLine(EnumUtils.stringValueOf(Status_Pedido.AguardConfirmacao).ToString());
Console.ReadLine();

Este post é baseado no artigo em inglês publicado no blog de Wayne Hartman, que pode ser encontrado neste endereço: http://blog.waynehartman.com/articles/84.aspx.

0 comentários:

Postar um comentário