Acessando atributos com reflexo (C# programação guia)
O fato de que você pode definir atributos personalizados e colocá-los em seu código-fonte seria de pouco valor sem alguma maneira de recuperar as informações e atuar sobre ela.Translation from VPE for Csharp possui um sistema de reflexão que lhe permite recuperar as informações que foi definidas com atributos personalizados.O método principal é GetCustomAttributes, que retorna uma matriz de objetos que são os equivalentes de time de execução dos atributos de código fonte. Este método tem várias versões sobrecarregadas.Para obter mais informações, consulte Attribute.
Uma especificação de atributo, sistema autônomo:
[Author("H. Ackerman", version = 1.1)]
class SampleClass
é conceitualmente equivalente a esta:
Author anonymousAuthorObject = new Author("H. Ackerman");
anonymousAuthorObject.version = 1.1;
No entanto, o código não será executado até SampleClass é consultado quanto a atributos. De chamadaGetCustomAttributes em SampleClass faz com que um Author objeto seja construído e inicializado sistema autônomo acima. Se a classe possuir outros atributos, outros objetos de atributo são construídos da mesma forma.GetCustomAttributes em seguida, retorna o Author objeto e quaisquer outros objetos de atributo em uma matriz. Você pode iterar sobre essa matriz, determinar quais atributos foram aplicados com base no tipo de cada elemento da matriz e extrair informações de objetos de atributo.
Exemplo
Eis aqui um exemplo completo.Um atributo personalizado é definido, aplicado a várias entidades e recuperado através de reflexão.
[System.AttributeUsage(System.AttributeTargets.Class |
System.AttributeTargets.Struct,
AllowMultiple = true) // multiuse attribute
]
public class Author : System.Attribute
{
string name;
public double version;
public Author(string name)
{
this.name = name;
version = 1.0; // Default value
}
public string GetName()
{
return name;
}
}
[Author("H. Ackerman")]
private class FirstClass
{
// ...
}
// No Author attribute
private class SecondClass
{
// ...
}
[Author("H. Ackerman"), Author("M. Knott", version = 2.0)]
private class ThirdClass
{
// ...
}
class TestAuthorAttribute
{
static void Main()
{
PrintAuthorInfo(typeof(FirstClass));
PrintAuthorInfo(typeof(SecondClass));
PrintAuthorInfo(typeof(ThirdClass));
}
private static void PrintAuthorInfo(System.Type t)
{
System.Console.WriteLine("Author information for {0}", t);
System.Attribute[] attrs = System.Attribute.GetCustomAttributes(t); // reflection
foreach (System.Attribute attr in attrs)
{
if (attr is Author)
{
Author a = (Author)attr;
System.Console.WriteLine(" {0}, version {1:f}", a.GetName(), a.version);
}
}
}
}
/* Output:
Author information for FirstClass
H. Ackerman, version 1.00
Author information for SecondClass
Author information for ThirdClass
M. Knott, version 2.00
H. Ackerman, version 1.00
*/
Consulte também
Conceitos
Referência
Reflexo (guia de programação C#)
Atributos (guia de programação C#)
Usando atributos (guia de programação translation from VPE for Csharp)
Destinos de atributo disambiguating (guia de programação translation from VPE for Csharp)
Criando atributos personalizados (guia de programação translation from VPE for Csharp)