CustomAttribute的值

时间:2016-09-28 22:36:31

标签: c# attributes

我正在尝试了解自定义属性的工作原理。 我有以下代码(主要基于this SO答案):

class Test
{
    public static void Main()
    {
        Console.WriteLine("before class constructor");
        var test = new TestClass();
        Console.WriteLine("after class constructor");

        Attribute[] attributes = Attribute.GetCustomAttributes(test.GetType()); 
    }
}

public class TestClassAttribute : Attribute
{
    public TestClassAttribute()
    {
        Second = "hello";
        Console.WriteLine("I am here. I'm the attribute constructor!");
    }
    public String First { get; set; }
    public String Second { get; set; }
    public override String ToString()
    {
        return String.Format("MyFirst: {0}; MySecond: {1}", First, Second);
    }
}

[TestClass(First = "customized")]
public class TestClass
{
    public int Foo { get; set; }
}

我在Main的最后一行放了一个断点,然后使用调试器深入到源代码中,直到TestClassAttribute构造函数被调用(发生在unsafe重载{ {1}})。一旦传递了构造函数的第一行,我在Locals窗口中有以下内容:

enter image description here

问题:

  1. 为什么CustomAttribute.GetCustomAttributes的值是从this返回的值?

  2. ToString没有任何价值。它会在什么时候[编辑:即MyFirst中的哪种方法初始化此属性]? (无法用调试器看到它​​发生,我不知道为什么)。

1 个答案:

答案 0 :(得分:0)

ToString是真正设计的(读取:设计)作为调试工具,这就是它在Locals窗口中显示为本地值的原因。

在运行构造函数之后,属性的任何名称参数似乎都是赋值。这很像我认为编译器解释的那样:

TestClassAttribute instance = new TestClassAttribute();
instance.First = "customized";