none
Acessar Attributes usando Reflection RRS feed

  • Pergunta

  • Caros, quando crio um Attribute e "enfeito" uma classe consigo acessar a informação porém não sei como acessar o Attribute de um atributo da classe

    ex:

        [AttributeUsage(AttributeTargets.All)]
        public class Obrigatorio : Attribute
        {
            public readonly bool _obrigatorio;
            public Obrigatorio(bool obrigatorio)
            {
                _obrigatorio = obrigatorio;
            }
        }


        [AttributeUsage(AttributeTargets.All)]
        public class ClassName : Attribute
        {
            public readonly string _className;
            public ClassName(string className)
            {
                _className = className;
            }
        }


        [ClassName("teste atributo")]
        public class TesteAttribute
        {
            [Obrigatorio(true)]
            int id { get; set; }
            [Obrigatorio(false)]
            string nome { get; set; }
        }  

      private void main()
            {
                PrintAuthorInfo(typeof(TesteAttribute));
            }


            private static void PrintAuthorInfo(Type t)
            {
                Console.WriteLine(" {0}", t);

                Attribute[] attrs = Attribute.GetCustomAttributes(t);  // Reflection.


                foreach (Attribute attr in attrs)
                {
                    if (attr is ClassName)
                    {
                        ClassName a = (ClassName)attr;
                        Console.WriteLine("   {0}", a._className);
                    } else if (attr is Obrigatorio)
                    {
                        Obrigatorio a = (Obrigatorio)attr;
                        Console.WriteLine("   {0}", a._obrigatorio.ToString());
                    }
                }
            }

    Desta forma eu acesso o valor do Attribute [ClassName("teste atributo")] porém não consigo acessar os Attributes [Obrigatorio(true)]
            int id { get; set; }
            [Obrigatorio(false)]
            string nome { get; set; }

    quinta-feira, 16 de fevereiro de 2012 17:09

Respostas

  • Olavo com o Link que me passou achei um outro link que me ajudou muito

    http://msdn.microsoft.com/en-us/library/system.attribute.aspx

    e a solução que achei por enquando foi esta, ainda vou refatorar mas dá pra ter uma ideia

    vlw pessoal

               for (int i = 0; i <= t.GetMembers().Count() - 1; i++ )
                {
                    Attribute[] atts = Attribute.GetCustomAttributes(t.GetMembers()[i]);  // Reflection.
                    foreach (Attribute atr in atts)
                    {
                         if (atr is Obrigatorio)
                        {
                            Obrigatorio a = (Obrigatorio)atr;
                            Console.WriteLine("  Obrigatório {0}  ", a._obrigatorio.ToString());
                        }
                    }

                }

    • Marcado como Resposta Edson Fiorese quinta-feira, 16 de fevereiro de 2012 19:01
    quinta-feira, 16 de fevereiro de 2012 19:01

Todas as Respostas

  • Amigo, você já deu uma lida neste guia ? http://msdn.microsoft.com/en-us/library/z919e8tw.aspx

    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)

    quinta-feira, 16 de fevereiro de 2012 17:50
    Moderador
  • Edson Fiorese,

    Você pode tetar o seguinte:

                Type t = typeof(Teste);
                object[] attrs = t.GetCustomAttributes(typeof(Obrigatorio), false);
                foreach (object attr in attrs)
                {
                    if (attr is Obrigatorio)
                    {
                        Obrigatorio obrigatorio = attr as Obrigatorio;
                        if (obrigatorio._obrigatorio)
                        {
                            //código vai aqui
                        }
                    }
                }

    Esta é a idéia básica. A partir dai você pode ir alterações conforme necessário. Atente que você está utilizado variáveis públicas nas suas classes. Preferia utilizar propriedades.

    Espero ter ajudado.


    Allan


    • Editado AllanFagner quinta-feira, 16 de fevereiro de 2012 18:08
    quinta-feira, 16 de fevereiro de 2012 18:06
  • Olavo com o Link que me passou achei um outro link que me ajudou muito

    http://msdn.microsoft.com/en-us/library/system.attribute.aspx

    e a solução que achei por enquando foi esta, ainda vou refatorar mas dá pra ter uma ideia

    vlw pessoal

               for (int i = 0; i <= t.GetMembers().Count() - 1; i++ )
                {
                    Attribute[] atts = Attribute.GetCustomAttributes(t.GetMembers()[i]);  // Reflection.
                    foreach (Attribute atr in atts)
                    {
                         if (atr is Obrigatorio)
                        {
                            Obrigatorio a = (Obrigatorio)atr;
                            Console.WriteLine("  Obrigatório {0}  ", a._obrigatorio.ToString());
                        }
                    }

                }

    • Marcado como Resposta Edson Fiorese quinta-feira, 16 de fevereiro de 2012 19:01
    quinta-feira, 16 de fevereiro de 2012 19:01