C#特性是指我们可以对类、以及C#程序集中的成员进行进一步的描述,比如我们写一个关于人的类Person,该类可以对人的属性以及某些行为(方法)进行描述。那么如果我们要对人类进行进一步描述呢,比如人这个类是属于动物的灵长类动物。有人会说我们可以为这个Person类去写一个灵长动物类的父类,再用人类去继承这个类去解决。但是我们要求的是仅仅是描述性的,就是对这个人类进行进一步的描述,而在实际操作中不需要去操作。这样的情况我们就可以用特性的概念去解决,特性简而言之就是程序集的特定程序元素所具有的另外的性质。
我们先写一个人类Person类
Class Person
{
//人的姓名储存字段和属性
private string name;
public string Name
{
set{name=value;}
get{return name;}
//人的年龄储存字段和属性
private int age;
public int Age
{
set{age=value;}
get{return age;}
}
}
//人的性别储存字段和属性
private char sex;
public char Sex
{
set{sex=value;}
get{return sex;}
}
//人的打招呼方法
public void SayHello()
{
Console.WriteLine("大家好,我叫{0},我今年{1}岁了,我的性别是{2}",this.Name,this.Age,this.Sex);
}
}
然后写动物的特性类AnimalAttribute类继承于Attribute(特性)
class AnimalAttribute:Attribute
{
//字段和属性描述是否是灵长类
private bool isPrimate;
public bool IsPrimate
{
set { isPrimate = value; }
get { return isPrimate; }
}
}
然后对人类进行动物类描述。即在人类的定义前面加:
[Animal(IsPrimate=true)]//为人类加特性,指定人类是灵长类。
下面我们就可以通过代码来获得人类的特性:
//声明特性对象,并通过Attribute类的静态方法GetCustomAttribute()获得人类的在动物类的特性,并赋值给特性对象
Attribute att1 = Attribute.GetCustomAttribute(typeof(Person), typeof(AnimalAttribute));
//将特性对象转化为动物特性对象
AnimalAttribute animalAtt = att1 as AnimalAttribute;
//检查转化是否成功如果成功则打印这个特性对象的是否是灵长类的属性。
if (animalAtt != null)
{
Console.WriteLine("人类是否是灵长类:{0}",animalAtt.IsPrimate);
}
Console.ReadKey();
注意:如果一个类有的某个特性类描述多次,则要用GetCustomAttributes()方法。
特殊的特性类
obsolete类用来指定该类的成员已经过时,在程序使用这个成员的时候会给出提示。
obsolete类的属性。
obsolete类常用的有两个属性,第一个属性是提示文字,第二个属性是是否报错。
比如如果我们的Person类的SayHello()方法现在不能用了,不允许程序员使用这个方法,那么我们就可以在Person类的SayHello方法前面加[obsolete("该方法已经过期,请找最新的方法。"),true]。
这样当我们在主程序中用到Person类的SayHello方法的时候程序就会报错。当然,如果第二个参数设置为false时,在调用该成员的时候不会报错,但是会报出警告。
特性的设置。
对于特性我们可以进一步设置,使用AttributeUsage类像使用特性一样进行使用即可,下面将语法:
[AttributeUsage(作用范围枚举,inherited=是否继承,AllowMultiple=是否允许多次描述。)]