Compartir a través de


Acceder a atributos personalizados

Una vez asociados los atributos con los elementos del programa, la reflexión se puede usar para consultar su existencia y valores. .NET proporciona el MetadataLoadContext, que se puede usar para examinar el código que no se puede cargar para su ejecución.

MetadataLoadContext

No se puede ejecutar el código cargado en el MetadataLoadContext contexto. Esto significa que no se pueden crear instancias de atributos personalizados, ya que eso requeriría ejecutar sus constructores. Para cargar y examinar atributos personalizados en el MetadataLoadContext contexto, use la CustomAttributeData clase . Puede obtener instancias de esta clase mediante la sobrecarga adecuada del método estático CustomAttributeData.GetCustomAttributes . Para obtener más información, vea Cómo: Inspeccionar el contenido del ensamblado mediante MetadataLoadContext.

Contexto de ejecución

Los métodos de reflexión principales para consultar atributos en el contexto de ejecución son MemberInfo.GetCustomAttributes y Attribute.GetCustomAttributes.

La accesibilidad de un atributo personalizado se comprueba con respecto al ensamblado en el que está asociado. Esto equivale a comprobar si un método en un tipo del ensamblado en el que está asociado el atributo personalizado puede llamar al constructor del atributo personalizado.

Métodos como Assembly.GetCustomAttributes(Boolean) comprueban la visibilidad y la accesibilidad del argumento de tipo. Solo el código del ensamblado que contiene el tipo definido por el usuario puede recuperar un atributo personalizado de ese tipo mediante GetCustomAttributes.

El siguiente ejemplo de C# es un patrón de diseño de atributo personalizado típico. Ilustra el modelo de reflexión de atributos personalizados en tiempo de ejecución.

System.DLL
public class DescriptionAttribute : Attribute
{
}

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

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

Si el tiempo de ejecución intenta recuperar los atributos personalizados para el tipo de atributo personalizado público DescriptionAttribute adjunto al método GetLanguage, realiza las siguientes acciones:

  1. El tiempo de ejecución comprueba que el argumento de tipo DescriptionAttribute para Type.GetCustomAttributes(Type type) es público y, por tanto, es visible y accesible.
  2. Se comprueba que el tipo MyDescriptionAttribute definido por el usuario, derivado de DescriptionAttribute, es visible y accesible en el ensamblado System.Web.dll, donde está adjunto al método GetLanguage().
  3. En tiempo de ejecución, se comprueba que el constructor de MyDescriptionAttribute es visible y accesible dentro del conjunto System.Web.dll.
  4. El tiempo de ejecución llama al constructor de MyDescriptionAttribute con los parámetros de atributo personalizados y devuelve el nuevo objeto al llamador.

El modelo de reflexión de atributos personalizado podría exponer instancias de tipos definidos por el usuario fuera del ensamblado en el que se define el tipo. Esto no es diferente de los miembros de la biblioteca del sistema de ejecución que devuelven instancias de tipos definidos por el usuario, tales como Type.GetMethods, que devuelve una matriz de RuntimeMethodInfo objetos. Para evitar que un cliente detecte información sobre un tipo de atributo personalizado definido por el usuario, defina los miembros del tipo para que no sean públicos.

En el ejemplo siguiente se muestra la manera básica de usar la reflexión para obtener acceso a atributos personalizados.

using System;

public class ExampleAttribute : Attribute
{
    private string stringVal;

    public ExampleAttribute()
    {
        stringVal = "This is the default string.";
    }

    public string StringValue
    {
        get { return stringVal; }
        set { stringVal = value; }
    }
}

[Example(StringValue="This is a string.")]
class Class1
{
    public static void Main()
    {
        System.Reflection.MemberInfo info = typeof(Class1);
        foreach (object attrib in info.GetCustomAttributes(true))
        {
            Console.WriteLine(attrib);
        }
    }
}
Public Class ExampleAttribute
    Inherits Attribute

    Private stringVal As String

    Public Sub New()
        stringVal = "This is the default string."
    End Sub

    Public Property StringValue() As String
        Get
            Return stringVal
        End Get
        Set(Value As String)
            stringVal = Value
        End Set
    End Property
End Class

<Example(StringValue:="This is a string.")> _
Class Class1
    Public Shared Sub Main()
        Dim info As System.Reflection.MemberInfo = GetType(Class1)
        For Each attrib As Object In info.GetCustomAttributes(true)
            Console.WriteLine(attrib)
        Next attrib
    End Sub
End Class

Consulte también