Creating Custom Attributes (C# and Visual Basic)

You can create your own custom attributes by defining an attribute class, a class that derives directly or indirectly from Attribute, which makes identifying attribute definitions in metadata fast and easy. Suppose you want to tag types with the name of the programmer who wrote the type. You might define a custom Author attribute class:

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

The class name is the attribute's name, Author. It is derived from System.Attribute, so it is a custom attribute class. The constructor's parameters are the custom attribute's positional parameters. In this example, name is a positional parameter. Any public read-write fields or properties are named parameters. In this case, version is the only named parameter. Note the use of the AttributeUsage attribute to make the Author attribute valid only on class and struct (Structure in Visual Basic) declarations.

You could use this new attribute as follows:

<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 has a named parameter, AllowMultiple, with which you can make a custom attribute single-use or multiuse. In the following code example, a multiuse attribute is created.

' 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

In the following code example, multiple attributes of the same type are applied to a 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... 
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...
}

Note

If your attribute class contains a property, that property must be read-write.

See Also

Reference

Reflection (C# and Visual Basic)

Attributes (C# and Visual Basic)

Accessing Attributes by Using Reflection (C# and Visual Basic)

System.Reflection

AttributeUsage (C# and Visual Basic)

Concepts

C# Programming Guide

Writing Custom Attributes

Other Resources

Visual Basic Programming Guide