John
John

Reputation: 747

When are Attribute instances created?

Are attributes instantiated at the same time as instances of the class to which they are applied?

Upvotes: 23

Views: 4989

Answers (2)

Samuel Neff
Samuel Neff

Reputation: 74909

Attributes are loaded when the Type.GetCustomAttributes() is called. If you just instantiate the class or even get the type, the attributes are not yet loaded.

See this example:

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

This prints out:

Calling AttributeLoadTest.TestStatic():

Loading class

Loading type..

Calling GetCustomAttributes()

ConsoleTestAttribute Constructor

So calling a static method, instantiating the class, getting the type, does not instantiate the attribute. Calling GetCustomAttributes() does.

Upvotes: 31

JohnB
JohnB

Reputation: 13713

No. Attributes are bound to the type and thus instantiated when the type is loaded.

Upvotes: -2

Related Questions