Usuário com melhor resposta
Acessar Attributes usando Reflection

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; }
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
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 :) -
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
-
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