<<CLR via C#>>用了10页纸来讲Attribute,其实重点只有这段话:
所谓"定制Attribute",就是一个类的实例,它被序列化成为驻留在元数据中的一个字节流.在运行的时候,可以对元数据中包含的字节进行反序列化,从而构造类的一个实例.
简而言之,就是对一个类的附加描述信息.我个人理解为编译到程序中的"注释".
这里不打算讨论如何使用Attribute,因为不同的Attribute他的使用方式肯定是不同的,列举其使用方法是MSDN干的事情.
也不打算说明如何定义你自己的Attribute,因为MSDN上说的比我更加详细.
我想说的其实就是,纯粹的定制Attribute毛线用都不起,只会给程序集中生成额外的元数据.如果你想找的类似EF中的[Key],使用非托管代码的[DllImport],序列化的特性[Serializable] 等等这些特性,你找错方向了,Attribute实现不了这些功能,真正起作用的是反射.你看到像魔法一样的,只增加一些Attribute,这些类或者方法或者其他什么的就有了使用非托管代码的能力,或者有了序列化的功能,或者自动的进行主键的设置操作,其实没有那么神奇,他们都是反射在背后做的.
Attribute只是给类,方法,属性这些Type增加了额外的信息.而后通过反射,在运行时取到额外信息(Attribute)的内容,接着再利用反射回来的信息进行操作判断,进行业务逻辑.
PS:还有编译器...
/*其实Attribute真的是非常强大的东西,结合反射使用只是其中的一部分,Attitude主要是面向编译器的.AOP编程中的PostSharp就是使用了Attribute.*/