AttributeUsage (C#-Programmierhandbuch)
Aktualisiert: November 2007
Legt fest, wie eine benutzerdefinierte Attributklasse verwendet werden kann. AttributeUsage ist ein Attribut, das auf benutzerdefinierte Attributdefinitionen angewendet werden kann, um die Anwendung des neuen Attributs zu steuern. Die Standardeinstellungen sehen wie folgt aus, wenn sie explizit angewendet werden:
[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 : System.Attribute { }
Das erste AttributeUsage-Argument muss aus einem oder mehreren Elementen der AttributeTargets-Enumeration bestehen. Mehrere Zieltypen können wie folgt mit einer OR-Verknüpfung verbunden werden:
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:
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. Beispiel:
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 hierzu finden Sie unter Zugriff auf Attribute mit Reflektion (C#-Programmierhandbuch).
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.
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
Konzepte
Referenz
Reflektion (C#-Programmierhandbuch)
Attribute (C#-Programmierhandbuch)
Verwenden von Attributen (C#-Programmierhandbuch)
Auflösen der Mehrdeutigkeit von Attributzielen (C#-Programmierhandbuch)
Erstellen benutzerdefinierter Attribute (C#-Programmierhandbuch)
Zugriff auf Attribute mit Reflektion (C#-Programmierhandbuch)