作为 C# 新手中的一员,我刚开始接触特性时,那真是一脸冏逼啊,怎么想怎么查资料都没弄明白它到底是个什么东西,有的入门教程甚至都没讲特性和反射这些概念!相信很多人第一次接触到特性就是关于系列化的知识了。
特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。 特性与程序实体关联后,即可在运行时使用名为 "反射" 的技术查询特性。
先弄明白一点,一个特性,如
,他其实就是一个类,定义方式跟类一样,且所有特性都是直接或间接继承自 Attribute 基类。
- Serializable
下面就来自定义一个特性
- MyAttribute
- [AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=false)]
- public class MyAttribute : Attribute //类名是特性的名称
- {
- public float Version;//命名参数
- private string Name;
- public MyAttribute(string name) //name为定位参数
- {
- this.Name = name;
- this.Version = 1.0f;
- }
- }
如何创建一个自定义特性:
)。
- [Serializable]
下面来应用该特性:
- [My("srf", Version = 1.2f)]
- class Test11
- {
- public float n;
- public Test11()
- {
- }
- public void PrintName()
- {
- }
- }
应用特性
其实是对构造函数的调用来实例化一个特性类。 根据约定,所有特性名称都以单词 "Attribute" 结束。 如可系列化标记特性
- [My("srf", Version = 1.2f)]
,它的全称为
- Serializable
,在代码中使用特性时,不需要指定 attribute 后缀,以上代码中同样只需要
- SerializableAttribute
来代表
- My
特性。
- MyAttribute
利用反射的原理,关联特性类与目标类型 (反射:主要利用 Type 类的属性和方法来获得一个目标类型的类型信息对象,然后根据该对象可以得到目标类型的信息,如它的字段、属性、方法名、类名等,有了这些信息,下一步就可以为所欲为了,可以还原该类型,即反系列化,甚至创建一个新类型) 如下代码:
- //1.判断Test11类定义时,是否应用了该特性
- if (typeof(Test11).IsDefined(typeof(MyAttribute),false))
- {
- //2.获得该特性对象,之后就可以访问它的成员(元数据)
- MyAttribute attribute = (MyAttribute)Attribute.GetCustomAttribute(typeof(Test11), typeof(MyAttribute));
- attribute.Version = 1.3f;
- }
当编译器发现一个特性应用到一个目标,并发生关联时:
关联代码可以定义在目标类型内部:
- [My("srf", Version = 1.2f)]
- class Test11
- {
- public float n;
- public Test11()
- {
- }
- public void PrintName()
- {
- //1.判断是否应用了该特性
- if (this.GetType().IsDefined(typeof(MyAttribute),false))
- {
- //2.获得该特性对象,之后就可以访问它的成员
- MyAttribute attribute = (MyAttribute)Attribute.GetCustomAttribute(typeof(Test11), typeof(MyAttribute));
- attribute.Version = 1.3f;
- this.n = attribute.Version;
- }
- }
- }
至于. NET 预定义特性的实现原理,我没研究过,大概类似自定义特性吧,就比如系列化特性
,实现原理我想大概是这样:应用
- SerializableAttribute
时给目标做一个 "标记",在. NET 内置程序集的某个地方判断该目标类型是否应用了该特性,然后决定是否进行系列化操作。
- [Serializable]
总之,特性其实没那么难,它就是一个类,或者说是一个用来服务于其它类型的类,一个目标类型应用了一个特性,那么这个目标类型就可以享受该特性提供的服务了!
以上纯属个人对特性的理解,有不对的地方请前辈们务必指正,以免误导!
来源: http://www.cnblogs.com/susufufu/p/6882498.html