Поделиться через


AttributeUsage (C# и Visual Basic)

Определяет, как можно использовать класс настраиваемых атрибутов. Атрибут AttributeUsage можно применить к пользовательским определениям атрибутов, чтобы проконтролировать применение нового атрибута. При явном применении параметры по умолчанию выглядят следующим образом:

    <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 { }

В этом примере класс NewAttribute можно применить к любой сущности кода с атрибутами, но только один раз к каждой сущности. Он наследуется производным классом при применении к базовому классу.

Аргументы AllowMultiple и Inherited являются необязательными, так что этот код имеет тот же результат:

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

Первый аргумент AttributeUsage должен состоять из одного или нескольких элементов перечисления AttributeTargets. Несколько типов целевых объектов можно связать с помощью оператора OR следующим образом.

Imports System


...


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


...


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

Если аргументу AllowMultiple присвоено значение true, то результирующий атрибут можно применить несколько раз к одной сущности следующим образом.

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 { }

В этом случае MultiUseAttr можно применять несколько раз, так как AllowMultiple имеет значение true. Для применения нескольких атрибутов допускаются оба показанных формата.

Если Inherited имеет значение false, то атрибут не наследуется классами, производными от класса с атрибутами. Примеры.

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 { }

В этом случае Attr1 не применяется к DClass путем наследования.

Заметки

Атрибут AttributeUsage можно использовать только один раз – его нельзя повторно применять к одному и тому же классу. AttributeUsage — это псевдоним для команды AttributeUsageAttribute.

Дополнительные сведения см. в разделе Обращение к атрибутам с помощью отражения (C# и Visual Basic).

Пример

В следующем примере демонстрируется действие аргументов Inherited и AllowMultiple по отношению к атрибуту AttributeUsage, а также способ перечисления настраиваемых атрибутов, примененных к классу.

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);
        }
    }
}

Пример результатов выполнения

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

См. также

Ссылки

Отражение (C# и Visual Basic)

Атрибуты (C# и Visual Basic)

Создание настраиваемых атрибутов (C# и Visual Basic)

Обращение к атрибутам с помощью отражения (C# и Visual Basic)

Attribute

System.Reflection

Основные понятия

Руководство по программированию на C#

Другие ресурсы

Руководство по программированию на Visual Basic

Расширение метаданных с помощью атрибутов