Como separar o valor de um enum com description

46 views
Skip to first unread message

gleidson guilherme

unread,
Nov 19, 2012, 7:51:56 AM11/19/12
to dotn...@googlegroups.com
Bom dia galera tudo bem,
estou precisando separar ums valores que vem de um  enum eu não estou conseguindo fazer isto com description, alguém ai sabe me dizer de que forma eu poderia  fazer isto,  ja agradeço deste ja, aqui vai o código do meu enum.

using System.ComponentModel;
namespace CatedralEvangelica.Dominio.Enum
{
   public enum StatusOrcamento
    {
       [Description("Em Edição")]
       EmEdição,

       [Description("Em Aprovação")]
       EmAprovação,

       Aprovado
       }

Zaquiel Grings

unread,
Nov 19, 2012, 8:10:52 AM11/19/12
to dotn...@googlegroups.com
Não sei se entendi bem o seu problema. Mas segue um exemplo onde carrego uma ComboBox a partir de um enum o T seria o teu enum. Ai em vez de carregar uma combo tu pode carregar uma lista e dividir os valores. Ou fazer 2 consultas filtrando por cada tipo.

 Type lType = typeof(T);

 FieldInfo[] lProps = lType.GetFields();

 pComboBox.DataSource = (from lField in lProps
                                    where ((DescriptionAttribute[])lField.GetCustomAttributes(typeof(DescriptionAttribute), false)).Length > 0
                                    select new
                                    {
                                        Descricao = ((DescriptionAttribute[])lField.GetCustomAttributes(typeof(DescriptionAttribute), false))[0].Description,
                                        Valor = lField.GetRawConstantValue().ToString()
                                    }).ToList();


--
==============================
Comunidade de desenvolvedores Dot Net no Brasil
 
WebSite: www.dotnetbr.com
 
E-mail do Grupo: dotn...@googlegroups.com
==============================



--
                     Zaquiel Grings

"Na vida existem dois grupos de pessoas.
No primeiro grupo está quem faz.
No segundo está quem leva o crédito.
Esteja sempre no primeiro grupo.
Pois no segundo há muita concorrência."

gleidson guilherme

unread,
Nov 19, 2012, 8:43:23 AM11/19/12
to dotn...@googlegroups.com
Bom dia Zaquiel Grings a tua solução ate funcionou retornando os meus valores do meu enum mais não vez o que eu queria que era apenas separar os valores tipo se o meu valor é EmEdição no meu dropdalist teria que vir Em Edição mais mesmo assim agradeço pela ajuda ok 
fica com deus.

Zaquiel Grings

unread,
Nov 19, 2012, 8:59:22 AM11/19/12
to dotn...@googlegroups.com
Bem o que tu quer fazer é o mesmo que eu faço na minha ComboBox, 

Depois de carregado o DataSource do teu componente tu tem que informar qual será o DataTextFiled (Descricao) e o DataValueFiled (Valor). E depois da um DataBind(), acredito que seja isso.

Jairo Azevedo

unread,
Nov 19, 2012, 10:14:19 AM11/19/12
to dotn...@googlegroups.com
Gleidson, tenta o bloco abaixo>

// Extension do Enum para retornar o Description de cada elemento. Pode ser deixado em uma classe separada de Extensions
    public static class EnumExtention
    {
        public static string GetDescription(this Enum value)
        {
            Type type = value.GetType();

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

            System.ComponentModel.DescriptionAttribute[] attribs = fieldInfo(typeof(System.ComponentModel.DescriptionAttribute), false) as System.ComponentModel.DescriptionAttribute[];

            return attribs.Length > 0 ? attribs[0].Description : System.Enum.GetName(type, value);        }
    }


// Segue um exemplo de Enum
using System.ComponentModel;

public class Enumerators
{
    public enum PropriedadeProdutoInventario
    {
        [Description("Item de propriedade do informante e em seu poder")]
        PropriedadeInformante = 0,
        [Description("Item de propriedade do informante em posse de terceiros")]
        PropriedadeInformanteEmPosseTerceiros = 1,
        [Description("Item de propriedade de terceiros em posse do informante")]
        PropriedadeTerceiros = 2
    }
}



// E no seu form ou webform, vc cria o método Format do Combo, vc coloca o código abaixo
        private void FormatarAparenciaResultadoCombo(object sender, ListControlConvertEventArgs e)
        {
            e.Value = (e.Value as Enum).GetDescription();
        }


E no construtor do seu form ou webform, o código abaixo:
            comboBox1.DataSource = Enum.GetValues(typeof(PropriedadeProdutoInventario));

Zaquiel Grings

unread,
Nov 19, 2012, 10:18:37 AM11/19/12
to dotn...@googlegroups.com
Isso ai.

Outra maneira de fazer.

Edmilson

unread,
Nov 20, 2012, 8:28:54 AM11/20/12
to dotn...@googlegroups.com
Eu não sei se isso acontece só comigo mas  fico  arrepiado  quando vejo  soluções tão complexas para coisas  tão simples, acho que é por isso que a maioria das pessoas sente tanta dificuldade em aprender a programar.Bem Uma maneira Siples é essa:

 private void CarregaCombo()
        {
            var lista = Enum.GetNames(typeof(StatusOrcamento));
           
            Dropdownlist1.DataSource = lista;
            Dropdownlist1.DataBind();
        }


=====>
Logicamente  a descrição saíra sem tratamento,  o  valor  pode ser representado pelo Index da Seleção do DropDown.


Edmilson

unread,
Nov 20, 2012, 8:35:09 AM11/20/12
to dotn...@googlegroups.com
Para Tratar a Descrição  do meu E-mail Anterior:

 public enum StatusOrcamento
    {
       Em_Elaboração,
       Em_Edição,
       Em_Aprovação,
       Aprovado

       
    }

 private void CarregaCombo()
        {
            var lista = Enum.GetNames(typeof(StatusOrcamento));

            for (int i = 0; i < lista.Length; i++)
            {
              lista[i] = lista[i].Replace("_", " ");
            }

           
            Dropdownlist1.DataSource = lista;
            Dropdownlist1.DataBind();
        }

Zaquiel Grings

unread,
Nov 20, 2012, 8:41:13 AM11/20/12
to dotn...@googlegroups.com
O problema de utilizar dessa forma é que tu não tem a liberdade de utilizar o Description, tendo que fazer um tratamento de strings.

Cada um usa o que acha melhor e se adapta a sua necessidade. O que é complexo para ti pode não ser para outros.



        }

--
==============================
Comunidade de desenvolvedores Dot Net no Brasil
 
WebSite: www.dotnetbr.com
 
E-mail do Grupo: dotn...@googlegroups.com
==============================

Edmilson

unread,
Nov 20, 2012, 8:50:34 AM11/20/12
to dotn...@googlegroups.com
@Zaquiel, acho que vc pode ter razão, o que pode ser complexo para uns pode não ser para outros.

De qualquer maneira ele só usou o description pois achou que automaticamente o texto seria tratado.

Agora veja bem,  se  existe uma forma de resolver um problema com 3 ou 4 linhas de código  e  outro  que o resultado é o mesmo e escreve  10  ou 15 linhas,  eu sempre fico com o primeiro, por pura preguiça mesmo.

[]´s

Edmilson

Thiago C. Santos

unread,
Nov 20, 2012, 8:50:52 AM11/20/12
to dotn...@googlegroups.com

Imo isso é gambiarra, o certo é usar attribute.

Att,

Thiago C. Santos



2012/11/20 Edmilson <edmils...@yahoo.com.br>

        }

--

Zaquiel Grings

unread,
Nov 20, 2012, 8:57:25 AM11/20/12
to dotn...@googlegroups.com
Não acho que teu pensamento esteja incorreto, não gosto de criticar a forma de resolver os problemas. Já trabalhei em lugares que se descobrissem que tu fez isso te chamariam a atenção, pois priorizavam reaproveitamento, qualidade, etc. (o meu superior é muito chato, essa é a verdade)
Em compensação onde trabalho hoje, isso seria o mais correto de fazer pela simplicidade. Por isso que eu disse, tem que se utilizar o que atende melhor a tua necessidade. 

E tem que ter o bom senso, pois soluções extremamente complexas podem dificultar a manutenção.

Na minha antiga empresa ministrei uma pequena palestra de Linq e passei por esse problema, muitos disseram que era melhor utilizar o foreach no exemplo que mostrei, pois era mais simples. Dai tive que dar toda uma explicação....

Mas faz parte...



--
==============================
Comunidade de desenvolvedores Dot Net no Brasil
 
WebSite: www.dotnetbr.com
 
E-mail do Grupo: dotn...@googlegroups.com
==============================

Edmilson

unread,
Nov 20, 2012, 9:07:00 AM11/20/12
to dotn...@googlegroups.com
O conceito de certo/errado em desenvolvimento é muito relativo,  o existe é, o que funciona, o que não funciona e o que funciona melhor (eficiência e eficácia).

Simplesmente mostrei uma das muitas maneiras de fazer e coloquei minha opinião sobre o overhead de soluções complexas.

Desculpem se ofendi alguém, juro que não foi minha intenção.

[]´s

Edmilson

Thiago C. Santos

unread,
Nov 20, 2012, 9:42:22 AM11/20/12
to dotn...@googlegroups.com

Edmilson,

A solução sugerida por você atende ao problema do nosso amigo, porém eu não acho ela ideal nem mesmo conveniente a sua solução por que acredito dar muito mais overhead e acaba deixando alterações muito mais complicadas e possibilita erros.

1. Da sua forma quando você quer pegar a descrição de um enum você tem que fazer o replace do enum primeiro. Então em todo lugar que você quiser pegar a descrição de um enum você tem que colocar o mesmo código de replace para o enum.

2. Você pega a descrição do próprio nome do enum, isso acho muito ruim por que você vai ter que ter um enum muito extenso ou uma descrição muito enxuta. Gosto do nome do enum ser curto e claro e a descrição normalmente é bem mais extensa:

public enum ProcessStatus{
 [Description("O processo está ATIVO.")]
 ACTIVATED,
 [Description("O processo está INATIVO.")]
 INACTIVE

Jairo Azevedo

unread,
Nov 20, 2012, 10:00:49 AM11/20/12
to dotn...@googlegroups.com
Pura preguiça foi boa!!
hahahahahahahaha

Falando sério agora. O problema de adotar esta solução é que se você exibir o texto "Pedidos Finalizados", obrigatoriamente você teria que ter um enum chamado Pedidos_Finalizados (poderia ser somente Finalizado). Seguindo a ideia, imagina se os status fossem "Em Aberto", "Cancelado", "Finalizado", "Criado" e por aí vai. 

Enfim, isso vai de solução para solução e de desenvolvedor para desenvolvedor.

Jairo.


Em 20 de novembro de 2012 11:50, Edmilson <edmils...@yahoo.com.br> escreveu:

--
==============================
Comunidade de desenvolvedores Dot Net no Brasil
 
WebSite: www.dotnetbr.com
 
E-mail do Grupo: dotn...@googlegroups.com
==============================



--

Thiago Aguiar

unread,
Nov 20, 2012, 10:31:04 AM11/20/12
to dotn...@googlegroups.com
veja isso




life runs on code

Thiago Aguiar


2012/11/20 Jairo Azevedo <jsou...@gmail.com>

Marcus Alexandre Silva

unread,
Nov 20, 2012, 10:31:04 AM11/20/12
to dotn...@googlegroups.com
Acho que as vezes a "não complexidade" vira zona. 
É comum se usar enumerações com atributos de descrição, as vezes é uma boa, as vezes não. Tem que se apegar sim ao problema, mas tem que ter abertura para, caso precise crescer, o trabalho seja minimizado...
Por outro lado, tratar strings da maneira que você fez é feio e me incomoda, mas... resolve por agora.

O problema é: E quando isto dai crescer? Reescrevo tudo?

Edmilson

unread,
Nov 20, 2012, 12:45:37 PM11/20/12
to dotn...@googlegroups.com
Pelo que vejo, estou na contra-mão do pessamento de alguns, parece  que  recursos simples com encapsulemanto não existem, parece que  a minha sugestão para o problema é menos manutenivel que  as soluções que  utilizam  reflection  e tal.

Aos  que acham  que  não  se pode reaproveitar, ampliar  ou manter vai mais uma alteração.

public enum StatusOrcamento
    {
       Em_Idéia,
       Em_Elaboração,
       Em_Edição,
       Em_Aprovação,
       Aprovado,
       Retornado
       
    }


   public class EnumHelper
   {
       public static string[] GetNames(Type enumType)
       {
           var lista = Enum.GetNames(enumType);


           for (int i = 0; i < lista.Length; i++)
           {
               lista[i] = lista[i].Replace("_", " ");
           }

           return lista;
      
       }
  
   }



 private void CarregaCombo()
        {
            var lista = EnumHelper.GetNames(typeof(StatusOrcamento));           
           
            Dropdownlist1.DataSource = lista;
            Dropdownlist1.DataBind();

Thiago C. Santos

unread,
Nov 20, 2012, 12:55:24 PM11/20/12
to dotn...@googlegroups.com

Imo gambiarra estendida.

Você criou uma classe com um método estatico somente para isso? Estender as funcionalidades do enum fica muito mais elegante, a manutenção muito mais fácil e fica transparente aonde quer que você queria usar a descrição.

Como que você pega a descrição de somente 1 enum? Não pega, ia ter que criar mais um método e ainda em toda classe teria que usar esse helper, já na solução oferecida pelo Jairo simplesmente você da um .GetDescription().



Thiago C. Santos

unread,
Nov 20, 2012, 1:13:54 PM11/20/12
to dotn...@googlegroups.com
Ainda tem a questão do nome do enum x descrição que desta forma sempre teria que ser igual que é muito inviável e para mim já anula esta solução.

Att,

Thiago C. Santos



2012/11/20 Thiago C. Santos <thiago.c...@gmail.com>

Edmilson

unread,
Nov 20, 2012, 1:17:54 PM11/20/12
to dotn...@googlegroups.com
Thiago,  concordo  com você,  a solução do Jairo  com Extension  fica muito mais elegante.

[]´s

Edmilson
Reply all
Reply to author
Forward
0 new messages