如此处所示,在您反映获取属性值之前,不会调用属性构造函数.但是,您可能也知道,只能将编译时常量值传递给属性构造函数.为什么是这样?我想很多人多喜欢做这样的事情:
[MyAttribute(new MyClass(foo, bar, baz, jQuery)]
Run Code Online (Sandbox Code Playgroud)
而不是传递一个字符串(导致字符串类型的代码!)与这些值,变成字符串,然后依靠Regex尝试获取值而不是仅使用实际值,而不是使用编译时警告/错误取决于对于可能抛出与该类无关的异常,除了它调用的方法使用了一些键入错误的属性.
这有什么限制?
Eri*_*ert 12
属性是元数据的一部分.您需要能够在程序集中反映元数据,而无需在该程序集中运行代码.
想象一下,例如,您正在编写一个需要从程序集中读取属性的编译器,以便编译一些源代码.您真的希望加载和执行引用程序集中的代码吗?您是否要求编译器编写者在编译期间编写可以在引用的程序集中运行任意代码的编译器?代码可能崩溃,或进入无限循环,或联系开发人员无权与之交谈的数据库?可怕场景的数量是巨大的,我们通过要求属性变得简单而消除所有这些场景.