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


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

Обновлен: Ноябрь 2007

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

[System.AttributeUsage(System.AttributeTargets.All, 
                   AllowMultiple=false, 
                   Inherited=true)]
class NewAttribute : System.Attribute { }

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

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

[System.AttributeUsage(System.AttributeTargets.All)]
class NewAttribute : System.Attribute { }

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

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

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

using System;
[AttributeUsage(AttributeTargets.Class, AllowMultiple=true)]
class MultiUseAttr : Attribute { }

[MultiUseAttr][MultiUseAttr]
class Class1 { }

[MultiUseAttr, MultiUseAttr]
class Class2 { }

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

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

using System;
[AttributeUsage(AttributeTargets.Class, Inherited=false)]
class Attr1 : Attribute { }

[Attr1]
class BClass { }

class DClass : BClass { }

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

Заметки

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

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

Пример

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

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#

Ссылки

Отражение (Руководство по программированию на C#)

Атрибуты (Руководство по программированию на C#)

Использование атрибутов (Руководство по программированию на C#)

Устранение неоднозначностей в целевых объектах атрибутов (Руководство по программированию на C#)

Создание настраиваемых атрибутов (руководство по программированию в C#)

Доступ к атрибутам через отражение (Руководство по программированию в C#)

Attribute

System.Reflection