特性提供了功能强大的方法:
用于将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。特性与程序实体关联后,即可在运行时使用“反射”的技术查询特性。
【系统特性】
序列化XML的[XMLSerializer]
序列化二进制[Serializable]
条件特性[Conditional(“DEBUG”)]
标记过时[Obsolete(“该类已经过时”,true)]
在下面这段代码中,条件特性标记了只能在DEBUG
模式下才能运行此方法。(PS: 在#Define DEBUG下无效)
class Program
{
public static void Main(string[] args)
{
MyClass.ShowMsg();
}
}
public class MyClass
{
//条件属性[Conditional("DEBUG")]当程序在Debug模式下,此方法才会被调用
[Conditional("DEBUG")]
public static void ShowMsg()
{
Console.WriteLine("this is myClass");
Console.ReadKey();
}
}
【自定义特性】
- 定义一个特性类:
//AttributeUsage(限制可以被自定义特性标记的类型)
//AllowMultiple = true表示此特性可以被多次使用在同一个标记类上,如果没有此特性,下面的[Author("Jerry",2.0)]将无效
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true)]
public class Author : Attribute
{
public string Name { get; set; }
public double Version { get; set; }
public Author(string _name, double _version)
{
this.Name = _name;
this.Version = _version;
}
}
- 应用特性:
[Author("Peter", 1.0)]
[Author("Jerry",2.0)]
//这里的Author可以理解成一个类,括号内是为此类的构造函数赋值
public class StudentModel
{
//code...
}
- 获取特性:
/// <summary>
/// 获取自定义特性
/// </summary>
/// <param name="t">类型</param>
public static void GetAttributeInfo(Type t)
{
var author = (Author[])Attribute.GetCustomAttributes(t, typeof(Author));
if (author == null)
{
Console.WriteLine("该类不存在任何特性");
}
else
{
for (int i = 0; i < author.Length; i++)
{
Console.WriteLine("{0}参与了{1}版本的程序编写", author[i].Name, author[i].Version);
}
}
Console.ReadKey();
}
- 我们在Main中获取StudentModel类的编辑作者和对应的版本号
public static void Main(string[] args)
{
GetAttributeInfo(typeof(StudentModel));
}
- 运行结果: