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


Создание настраиваемых атрибутов

Вы можете создавать собственные настраиваемые атрибуты, определяя класс атрибутов, класс, производный напрямую или косвенно от Attribute, что позволяет быстро и легко идентифицировать определения атрибутов в метаданных. Предположим, вы хотите пометить типы с именем программиста, который написал тип. Можно определить пользовательский Author класс атрибутов:

[System.AttributeUsage(System.AttributeTargets.Class |
                       System.AttributeTargets.Struct)
]
public class AuthorAttribute : System.Attribute
{
    private string Name;
    public double Version;

    public AuthorAttribute(string name)
    {
        Name = name;
        Version = 1.0;
    }
}

Имя класса — это имя атрибута AuthorAttribute, плюс суффикс Author. Он является производным от System.Attribute, поэтому это класс настраиваемых атрибутов. Параметры конструктора — это позиционные параметры настраиваемого атрибута. В этом примере name используется позиционный параметр. Все открытые поля или свойства для чтения и записи являются именованными параметрами. В этом случае version является единственным именованным параметром. Обратите внимание на использование атрибута AttributeUsage, чтобы атрибут Author был допустим только в объявлениях классов и struct.

Этот новый атрибут можно использовать следующим образом:

[Author("P. Ackerman", Version = 1.1)]
class SampleClass
{
    // P. Ackerman's code goes here...
}

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

[System.AttributeUsage(System.AttributeTargets.Class |
                       System.AttributeTargets.Struct,
                       AllowMultiple = true)  // Multiuse attribute.
]
public class AuthorAttribute : System.Attribute
{
    string Name;
    public double Version;

    public AuthorAttribute(string name)
    {
        Name = name;

        // Default value.
        Version = 1.0;
    }

    public string GetName() => Name;
}

В следующем примере кода к классу применяются несколько атрибутов одного типа.

[Author("P. Ackerman"), Author("R. Koch", Version = 2.0)]
public class ThirdClass
{
    // ...
}

См. также