Share via


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)

Attribute

System.Reflection

Konzepte

C#-Programmierhandbuch

Erweitern von Metadaten mithilfe von Attributen

Weitere Ressourcen

Visual Basic-Programmierhandbuch