何时创建属性实例?

Joh*_*ohn 16 .net attributes

属性是否与应用它们的类的实例同时实例化?

Sam*_*eff 23

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

打印出:

调用AttributeLoadTest.TestStatic():

加载课程

装货类型..

调用GetCustomAttributes()

ConsoleTestAttribute构造函数

因此,调用静态方法,实例化类,获取类型,不会实例化该属性.打电话GetCustomAttributes().

  • @SamualNeff感谢您的回复,我理解延迟加载的目的,但我实际上更感兴趣的是为什么属性需要延迟加载,而不是与父类型同时加载。经过一番挖掘,我在这里找到了答案:http://stackoverflow.com/a/417302/535930 (2认同)