AttributeUsage (C# y Visual Basic)
Determina cómo se puede utilizar una clase de atributos personalizada. 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
Crear atributos personalizados (C# y Visual Basic)
Obtener acceso a los atributos mediante la reflexión (C# y Visual Basic)