Когда создаются экземпляры атрибута?

Являются ли атрибуты экземплярами одновременно экземплярами класса, к которому они применяются?

Ответ 1

Атрибуты загружаются при вызове Type.GetCustomAttributes(). Если вы просто создаете экземпляр класса или даже получаете тип, атрибуты еще не загружены.

См. этот пример:

class Program
{
    static void Main()
    {
        Console.WriteLine("Calling AttributeLoadTest.TestStatic():");
        AttributeLoadTest.TestStatic();
        Console.WriteLine("Loading class");
        var x = new AttributeLoadTest();
        Console.WriteLine("Loading type..");
        var t = typeof (AttributeLoadTest);
        Console.WriteLine("Calling GetCustomAttributes()");
        var ats = t.GetCustomAttributes(false);
    }
}

[ConsoleTest]
class AttributeLoadTest
{
    public static void TestStatic()
    {

    }
}

[AttributeUsage(AttributeTargets.Class)]
class ConsoleTestAttribute : Attribute
{
    public ConsoleTestAttribute()
    {
        Console.WriteLine("ConsoleTestAttribute Constructor");
    }
}

Это выдает:

Вызов AttributeLoadTest.TestStatic():

Загрузка класса

Тип загрузки..

Вызов GetCustomAttributes()

Конструктор ConsoleTestAttribute

Так что вызов статического метода, создание экземпляра класса, получение типа, не создает экземпляр атрибута. Вызов GetCustomAttributes() делает.

Ответ 2

Нет. Атрибуты привязаны к типу и, таким образом, создаются при загрузке типа.