Являются ли атрибуты экземплярами одновременно экземплярами класса, к которому они применяются?
Когда создаются экземпляры атрибута?
Ответ 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
Нет. Атрибуты привязаны к типу и, таким образом, создаются при загрузке типа.