Adicionando descrição para itens de "enum" no C#

O enum é uma excelente estrutura para mapear valores sem a necessidade de uma tabela no banco de dados. A grande vantagem é tornar o código muito mais claro, principalmente nas regras de negócio. Um enum consiste de conjuntos de um nome e de um valor inteiro, podendo o tipo "de baixo" ser byte, small ou int de acordo com a sua necessidade.

Veja um exemplo abaixo:

    public enum CodUFIbge : byte
    {
        /// <summary>Acre</summary>
        [Description("Acre")]
        AC = 12,
        /// <summary>Alagoas</summary>
        [Description("Alagoas")]
        AL = 27,
...
        /// <summary>Distrito Federal</summary>
        [Description("Distrito Federal")]
        DF = 53,
        /// <summary>Espírito Santo</summary>
        [Description("Espírito Santo")]
        ES = 32,
...
        /// <summary>São Paulo</summary>
        [Description("São Paulo")]
        SP = 35,
        /// <summary>Tocantins</summary>
        [Description("Tocantins")]
        TO = 17
    }

Note a adição do comentário com a tag <summary> que permite ao Visual Studio mostrar a ajuda no intellisense e note as instâncias da classe DescriptionAttribute do namespace System.ComponentModel. Assim, dentro do programa poderemos atribuir valores como:

CodUFIbge uf = CodUFIbge.DF;

ou

if (uf == CodUFIbge.SP) aliquotaIcms = 0.07;

Para levar mais adiante, pode-se acessar programaticamente o atributo de descrição associado ao enum. Veja o seguinte código:

System.Reflection.MemberInfo[] mia = null;
System.ComponentModel.DescriptionAttribute[] atribs = null;
foreach (Enum teste in Enum.GetValues(typeof(CrucialComBr.ProvedorDados.CodUFIbge)))
{
mia = teste.GetType().GetMember(teste.ToString());
atribs = (mia != null && mia.Length > 0) ? (System.ComponentModel.DescriptionAttribute[])
mia[0].GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false) : null;
Console.WriteLine(atribs != null && atribs.Length == 1 ?
atribs[0].Description : teste.ToString());
}
blog comments powered by Disqus