我正在尝试了解自定义属性的工作原理。 我有以下代码(主要基于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窗口中有以下内容:
问题:
为什么CustomAttribute.GetCustomAttributes
的值是从this
返回的值?
ToString
没有任何价值。它会在什么时候[编辑:即MyFirst
中的哪种方法初始化此属性]? (无法用调试器看到它发生,我不知道为什么)。
答案 0 :(得分:0)
ToString
是真正设计的(读取:设计)作为调试工具,这就是它在Locals窗口中显示为本地值的原因。
在运行构造函数之后,属性的任何名称参数似乎都是赋值。这很像我认为编译器解释的那样:
TestClassAttribute instance = new TestClassAttribute();
instance.First = "customized";