AttributeUsage (C# und Visual Basic)
Bestimmt, wie eine benutzerdefinierte Attributklasse verwendet werden kann.AttributeUsage ist ein Attribut, das auf benutzerdefinierte Attributdefinitionen angewendet werden kann, um zu steuern, wie das neue Attribut angewendet werden kann.Die Standardeinstellungen sehen wie folgt aus, wenn sie explizit angewendet werden:
<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 { }
In diesem Beispiel kann die NewAttribute-Klasse auf jede attributfähige Codeentität angewendet werden. Allerdings kann sie nur einmal auf jede Entität angewendet werden.Bei Anwendung auf eine Basisklasse wird sie von abgeleiteten Klassen geerbt.
Das AllowMultiple-Argument und das Inherited-Argument sind optional. Somit hat dieser Code die gleiche Wirkung:
<System.AttributeUsage(System.AttributeTargets.All)>
Class NewAttribute
Inherits System.Attribute
End Class
[System.AttributeUsage(System.AttributeTargets.All)]
class NewAttribute : System.Attribute { }
Das erste AttributeUsage-Argument muss aus einem oder mehreren Elementen der AttributeTargets-Enumeration bestehen.Mehrere Zieltypen können wie folgt mit dem OR-Operator verknüpft werden:
Imports System
...
<AttributeUsage(AttributeTargets.Property Or AttributeTargets.Field)>
Class NewPropertyOrFieldAttribute
Inherits Attribute
End Class
using System;
...
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
class NewPropertyOrFieldAttribute : Attribute { }
Wenn das AllowMultiple-Argument auf true festgelegt ist, dann kann das resultierende Attribut auf die folgende Weise mehrfach auf eine einzelne Entität angewendet werden:
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 { }
In diesem Fall kann MultiUseAttr immer wieder übernommen werden, da AllowMultiple auf true festgelegt ist.Beide Formate, die für die Übernahme mehrerer Attribute gezeigt wurden, sind gültig.
Wenn Inherited auf false festgelegt ist, dann wird das Attribut nicht von Klassen geerbt, die von einer attributierten Klasse abgeleitet sind.Beispiele:
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 { }
In diesem Fall wird Attr1 nicht durch Vererbung auf DClass angewendet.
Hinweise
Das AttributeUsage-Attribut ist ein einmal verwendbares Attribut, es kann einer Klasse nur einmal zugeordnet werden.AttributeUsage ist ein Alias für AttributeUsageAttribute.
Weitere Informationen finden Sie unter Zugreifen auf Attribute mithilfe der Reflektion (C# und Visual Basic).
Beispiel
Das folgende Beispiel veranschaulicht den Effekt, den das Inherited-Argument und dasAllowMultiple-Argument auf das AttributeUsage-Attribut haben. Außerdem wird gezeigt, wie die auf eine Klasse angewendeten benutzerdefinierten Attribute aufgelistet werden können.
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);
}
}
}
Beispielausgabe
Attributes on Base Class:
A1
A2
Attributes on Derived Class:
A3
A3
A2
Siehe auch
Referenz
Reflektion (C# und Visual Basic)
Attribute (C# und Visual Basic)
Erstellen benutzerdefinierter Attribute (C# und Visual Basic)
Zugreifen auf Attribute mithilfe der Reflektion (C# und Visual Basic)