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

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

<System.AttributeUsage(System.AttributeTargets.Class Or 
                       System.AttributeTargets.Struct)> 
Public Class Author
    Inherits System.Attribute
    Private name As String 
    Public version As Double 
    Sub New(ByVal authorName As String)
        name = authorName
        version = 1.0
    End Sub 
End Class
[System.AttributeUsage(System.AttributeTargets.Class |
                       System.AttributeTargets.Struct)
]
public class Author : System.Attribute
{
    private string name;
    public double version;

    public Author(string name)
    {
        this.name = name;
        version = 1.0;
    }
}

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

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

<Author("P. Ackerman", Version:=1.1)> 
Class SampleClass
    ' P. Ackerman's code goes here... 
End Class
[Author("P. Ackerman", version = 1.1)]
class SampleClass
{
    // P. Ackerman's code goes here...
}

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

' multiuse attribute
<System.AttributeUsage(System.AttributeTargets.Class Or 
                       System.AttributeTargets.Struct, 
                       AllowMultiple:=True)> 
Public Class Author
    Inherits System.Attribute
[System.AttributeUsage(System.AttributeTargets.Class |
                       System.AttributeTargets.Struct,
                       AllowMultiple = true)  // multiuse attribute
]
public class Author : System.Attribute

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

<Author("P. Ackerman", Version:=1.1), 
Author("R. Koch", Version:=1.2)> 
Class SampleClass
    ' P. Ackerman's code goes here... 
    ' R. Koch's code goes here... 
End Class
[Author("P. Ackerman", version = 1.1)]
[Author("R. Koch", version = 1.2)]
class SampleClass
{
    // P. Ackerman's code goes here... 
    // R. Koch's code goes here...
}

Примечание

Если в классе атрибута содержится свойство, то оно должно быть доступно для чтения и записи.

См. также

Ссылки

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

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

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

System.Reflection

AttributeUsage (C# и Visual Basic)

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

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

Написание настраиваемых атрибутов

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

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