AttributeUsage (C# y Visual Basic)

Determina cómo se puede utilizar una clase de atributos personalizados. AttributeUsage es un atributo que puede aplicarse a definiciones de atributos personalizados para controlar cómo se aplica el nuevo atributo. La configuración predeterminada es similar a la siguiente cuando se aplica explícitamente:

    <System.AttributeUsage(System.AttributeTargets.All, 
                       AllowMultiple:=False, 
                       Inherited:=True)> 
    Class NewAttribute
        Inherits System.Attribute
    End Class

[System.AttributeUsage(System.AttributeTargets.All,
                   AllowMultiple = false,
                   Inherited = true)]
class NewAttribute : System.Attribute { }

En este ejemplo, la clase NewAttribute se puede aplicar a cualquier entidad de código con atributo, pero sólo se puede aplicar una vez a cada entidad. Cuando se aplica a una clase base, es heredada por las clases derivadas.

Los argumentos AllowMultiple y Inherited son opcionales, por lo que este código tiene el mismo efecto:

<System.AttributeUsage(System.AttributeTargets.All)> 
Class NewAttribute
    Inherits System.Attribute
End Class
[System.AttributeUsage(System.AttributeTargets.All)]
class NewAttribute : System.Attribute { }

El primer argumento AttributeUsage debe ser uno o más elementos de la enumeración AttributeTargets. Varios tipos de destino se pueden vincular entre sí con el operador OR, como se indica a continuación:

Imports System


...


<AttributeUsage(AttributeTargets.Property Or AttributeTargets.Field)> 
Class NewPropertyOrFieldAttribute
    Inherits Attribute
End Class
using System;


...


[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
class NewPropertyOrFieldAttribute : Attribute { }

Si el argumento AllowMultiple se establece en true, el atributo resultante se puede aplicar más de una vez a una misma entidad, como se indica a continuación:

Imports System


...


    <AttributeUsage(AttributeTargets.Class, AllowMultiple:=True)> 
    Class MultiUseAttr
        Inherits Attribute
    End Class

    <MultiUseAttr(), MultiUseAttr()> 
    Class Class1
    End Class

using System;


...


[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
class MultiUseAttr : Attribute { }

[MultiUseAttr]
[MultiUseAttr]
class Class1 { }

[MultiUseAttr, MultiUseAttr]
class Class2 { }

En este caso, se puede aplicar MultiUseAttr repetidamente porque AllowMultiple está establecido en true. Ambos formatos son válidos para aplicar varios atributos.

Si Inherited se establece en false, el atributo no es heredado por las clases que se derivan de una clase atribuida. Por ejemplo:

Imports System


...


<AttributeUsage(AttributeTargets.Class, Inherited:=False)> 
Class Attr1
    Inherits Attribute
End Class

<Attr1()> 
Class BClass

End Class  

Class DClass
    Inherits BClass
End Class
using System;


...


[AttributeUsage(AttributeTargets.Class, Inherited = false)]
class Attr1 : Attribute { }

[Attr1]
class BClass { }

class DClass : BClass { }

En este caso, Attr1 no se aplica a DClass a través de la herencia.

Comentarios

El atributo AttributeUsage es un atributo de uso único, no se puede aplicar más de una vez a la misma clase. AttributeUsage es un alias de AttributeUsageAttribute.

Para obtener más información, vea Obtener acceso a los atributos mediante la reflexión (C# y Visual Basic).

Ejemplo

En el ejemplo siguiente se muestra el efecto de los argumentos Inherited y AllowMultiple en el atributo AttributeUsage, y cómo se pueden enumerar los atributos personalizados aplicados a una clase.

Imports System


...


    ' Create some custom attributes:
    <AttributeUsage(System.AttributeTargets.Class, Inherited:=False)> 
    Class A1
        Inherits System.Attribute
    End Class

    <AttributeUsage(System.AttributeTargets.Class)> 
    Class A2
        Inherits System.Attribute
    End Class    

    <AttributeUsage(System.AttributeTargets.Class, AllowMultiple:=True)> 
    Class A3
        Inherits System.Attribute
    End Class


    ' Apply custom attributes to classes:
    <A1(), A2()> 
    Class BaseClass

    End Class

    <A3(), A3()> 
    Class DerivedClass
        Inherits BaseClass
    End Class


    Public Class TestAttributeUsage
        Sub Main()
            Dim b As New BaseClass
            Dim d As New DerivedClass
            ' Display custom attributes for each class.
            Console.WriteLine("Attributes on Base Class:")
            Dim attrs() As Object = b.GetType().GetCustomAttributes(True)

            For Each attr In attrs
                Console.WriteLine(attr)
            Next

            Console.WriteLine("Attributes on Derived Class:")
            attrs = d.GetType().GetCustomAttributes(True)
            For Each attr In attrs
                Console.WriteLine(attr)
            Next            
        End Sub
    End Class

using System;


...


// Create some custom attributes:
[AttributeUsage(System.AttributeTargets.Class, Inherited = false)]
class A1 : System.Attribute { }

[AttributeUsage(System.AttributeTargets.Class)]
class A2 : System.Attribute { }

[AttributeUsage(System.AttributeTargets.Class, AllowMultiple = true)]
class A3 : System.Attribute { }

// Apply custom attributes to classes:
[A1, A2]
class BaseClass { }

[A3, A3]
class DerivedClass : BaseClass { }

public class TestAttributeUsage
{
    static void Main()
    {
        BaseClass b = new BaseClass();
        DerivedClass d = new DerivedClass();

        // Display custom attributes for each class.
        Console.WriteLine("Attributes on Base Class:");
        object[] attrs = b.GetType().GetCustomAttributes(true);
        foreach (Attribute attr in attrs)
        {
            Console.WriteLine(attr);
        }

        Console.WriteLine("Attributes on Derived Class:");
        attrs = d.GetType().GetCustomAttributes(true);
        foreach (Attribute attr in attrs)
        {
            Console.WriteLine(attr);
        }
    }
}

Resultados del ejemplo

Attributes on Base Class:
A1
A2
Attributes on Derived Class:
A3
A3
A2

Vea también

Referencia

Reflexión (C# y Visual Basic)

Atributos (C# y Visual Basic)

Crear atributos personalizados (C# y Visual Basic)

Obtener acceso a los atributos mediante la reflexión (C# y Visual Basic)

Attribute

System.Reflection

Conceptos

Guía de programación de C#

Extender metadatos mediante atributos

Otros recursos

Guía de programación en Visual Basic