Share via


Ao acessar atributos personalizados

Após atributos associados a elementos do programa, reflexão pode ser usado para consultar seus valores e existência.No .NET estrutura versão 1.0 e 1.1, atributos personalizados são examinados no contexto de execução.O .NET estrutura versão 2.0 fornece um contexto de carga novo, contexto somente de reflexão, que pode ser usado para examinar o código que não pode ser carregado para execução.

O contexto somente de reflexão

Não é possível executar o código carregado no contexto somente de reflexão.Isso significa que não é possível criar instâncias de atributos personalizados, pois isso exigiria executando seus construtores.Para carregar e examine os atributos personalizados no contexto somente de reflexão, use o CustomAttributeData classe. Você pode obter as instâncias dessa classe usando a sobrecarga apropriada do estático CustomAttributeData.GetCustomAttributes método. Consulte Como: Carregar assemblies no contexto somente de reflexão.

O contexto de execução

Os métodos de reflexão principais atributos de consulta no contexto de execução são sistema.Reflection.MemberInfo.GetCustomAttributes and sistema.Reflection.Assembly.GetCustomAttributes.

A acessibilidade de um atributo personalizado é verificada em relação ao assembly no qual ele está anexado.Isso é equivalente a verificar se um método em um tipo no assembly em que o atributo personalizado anexado pode chamar o construtor de atributo personalizado.

Métodos, sistema autônomo sistema.reflexão.Assembly.GetCustomAttributes (tipo, booliano) Verifique a visibilidade e acessibilidade de argumento de tipo.Somente o código no assembly que contém o tipo definido pelo usuário pode recuperar um atributo personalizado desse tipo usando GetCustomAttributes.

O exemplo a seguir translation from VPE for Csharp é um padrão de design típico de atributo personalizado.Ele ilustra o modelo de reflexão de atributo personalizado em tempo de execução.

System.DLL
public class DescriptionAttribute : Attribute
{
}

System.Web.DLL
internal class MyDescriptionAttribute : DescriptionAttribute
{
}

public class LocalizationExtenderProvider
{
    [MyDescriptionAttribute(...)]
    public CultureInfo GetLanguage(...)
    {
    }
}

Se o tempo de execução está tentando recuperar os atributos personalizados para o atributo personalizado público digite DescriptionAttribute anexado ao GetLanguage método, ele executa as seguintes ações:

  1. O tempo de execução verifica que o tipo de argumento DescriptionAttribute to Type.GetCustomAttributes(Tipo de tipo) é pública e, portanto, é visíveis e acessíveis.

  2. O tempo de execução verifica que o tipo definido pelo usuário MyDescriptionAttribute que é derivada de DescriptionAttribute estiver visível e acessível dentro de sistema.Web.DLL assembly, onde ele está conectado para o método GetLanguage().

  3. O tempo de execução verifica que o construtor de MyDescriptionAttribute estiver visível e acessível dentro de sistema.Web.DLL assembly.

  4. O tempo de execução chama o construtor de MyDescriptionAttribute com o atributo personalizado de parâmetros e retorna o novo objeto para o chamador.

O modelo de reflexão de atributo personalizado pode vazar instâncias de tipos definidos pelo usuário fora do assembly no qual o tipo é definido.Isso não é diferente dos membros na biblioteca de tempo de execução do sistema que retornam sistema autônomo instâncias de tipos definidos pelo usuário, sistema autônomo Type.GetMethods() retornar uma matriz de RuntimeMethodInfo objetos.Para impedir que um cliente de descoberta de informações sobre um tipo de atributo personalizado definido pelo usuário, defina membros do tipo a ser confidenciais.

O exemplo a seguir demonstra a forma básica de usando reflexão para obter acesso a atributos personalizados.

Class Class1
    Public Shared Sub Main()
        Dim info As System.Reflection.MemberInfo = GetType(Class1)
        Dim attributes() As Object = info.GetCustomAttributes(True)
        For i As Integer = 0 To attributes.Length - 1
            System.Console.WriteLine(attributes(i))
        Next i
    End Sub
End Class
class MyClass 
{ 
    public static void Main() 
    {
        System.Reflection.MemberInfo info = typeof(MyClass);
        object[] attributes = info.GetCustomAttributes(true);
        for (int i = 0; i < attributes.Length; i++)
        {
            System.Console.WriteLine(attributes[i]);
        }
    }
}

Consulte também

Conceitos

Exibindo informações de tipo

Considerações de segurança para reflexão

Referência

MemberInfo.GetCustomAttributes

Attribute.GetCustomAttributes