MSDN说明:
特性具有以下属性:
特性可向程序中添加元数据。 元数据是有关在程序中定义的类型的信息。 所有的 .NET 程序集都包含指定的一组元数据,这些元数据描述在程序集中定义的类型和类型成员。 可以添加自定义特性,以指定所需的任何附加信息。
可以将一个或多个特性应用到整个程序集、模块或较小的程序元素(如类和属性)。
程序可以使用反射检查自己的元数据或其他程序内的元数据。
以上注意红色文字“运行时”和“反射”
要说在编辑器给代码添加注释(如:string UserID; //用户名),那么Attribute(特性)就是在程序运行的时候添加注释。所谓的程序运行的时候添加注释,到底是什么意思呢?那就要说“反射”了。
看例子:
public class attrClass //定义一个类
{
public void Fun1()
{ }
public void Fun2()
{ }
public void Fun3()
{ }
}
class Program //控制台启动程序测试反射结果
{
public static void Main(string[] args)
{
Type type = typeof(TestClass); //TestClass获取类型
foreach (MethodInfo method in type.GetMethods()) //反射 ,获取TestClass类的所有公共方法
{
Console.WriteLine("{0} is Function.", method.Name); //打印的名字
}
Console.Read();
}
}
运行时,
控制台打印结果
Fun1 is Function.
Fun2 is Function.
Fun3 is Function.
ToString is Function. //所有类继承自object,object公共方法
Equals is Function. //所有类继承自object,object公共方法
GetHashCode is Function. //所有类继承自object,object公共方法
GetType is Function. //所有类继承自object,object公共方法
从上面可以看出,我们在运行时 ,通过“反射” 获取了TestClass类的公共方法。
但是你只在运行时“反射”获得了方法,却不知道方法是干什么的。现在我想在运行时,让反射的方法添加方法的使用说明,那该怎么办呢?相信你已经知道了,使用 Attribute
(特性)。
在上面的例子中,假如Fun1()方法是做第一件事情,Fun2()方法是做第二件事情,Fun3()方法是做第三件事情。我们就可以使用特性描述每个方法的作用。
现在我们改写代码:
添加特性类:
public class AttrTestAttribute : Attribute
{
public string funName;
public string action;
public AttrTestAttribute(string funName,string action)
{
this.funName = funName; //描述方法的名字
this.action = action; //描述方法的作用
}
}
然后改写上面的TestClass类:
{
[AttrTest("Fun1","做第一件事")]
public void Fun1()
{ }
[AttrTest("Fun2", "做第二件事")]
public void Fun2()
{ }
[AttrTest("Fun3", "做第三件事")]
public void Fun3()
{ }
}
class Program //控制台启动程序测试反射结果
{
public static void Main(string[] args)
{
foreach (MethodInfo method in type.GetMethods())
{
AttrTestAttribute at = (AttrTestAttribute)Attribute.GetCustomAttribute(method, typeof(AttrTestAttribute)); //获取方法的AttrTestAttribute 特性 的注释描述
if (at != null) //如果是AttrTestAttribute 特性 的注释描述
{
Console.WriteLine("{0} function nameis {1} action:{2}", method.Name,at.funName,at.action);
}
}
Console.Read();
}
}
控制台打印结果
Fun1 function nameis Fun1 action:做第一件事
Fun2 function nameis Fun2 action:做第二件事
Fun3 function nameis Fun3 action:做第三件事
通过上面的代码测试 ,Attribute(特性)作用是运行时,与“反射”获取方法、属性等对象绑定,用来描述反射的方法、属性等对象的特征,作用。如上面我们使用特性分别描述
fun1、fun2、fun3的作用。
Attribute(特性)的作用是 在使用反射时 ,告诉开发者“反射”的方法、属性等成员的使用方法,和方法的功能信息 。有人问为什么要有特性,感觉没用。
其实是这样,如果你已经写好了一个程序集,生成了一个dll文件,此时你无法再看里面的源代码,但是为了特殊环境需要,你还想让第三方使用此dll,但不想让他看源码,此时,第三方可以使用反射的方法 ,把你的dll里面的方法反射出来,但是又遇到一个问题,第三方虽然获得了方法,但是不知道怎么用,这是就可以使用特性来为方法添加
注释性的描述。说的更通俗一点,Attribute(特性)就是方法、字段、属性等成员的(描述)属性。