特性本质上是一个类,其为目标元素提供关联附加信息,并在运行期以反射的方式来获取附加信息;(attribute和.net framework 文件的元数据保存在一块儿,能够用来在运行时描述你的代码,或者在程序运行的时候影响应用程序的行为)所谓的定制特性就是为目标元素,能够是数据集,类,方法,属性,相似于注释,可是能够在运行期以反射的方式得到,定制特性主要应用在序列化,编译器指令,设计模式等方面;c#
目标元素包括:assembly module type property event field method param return
(其实关于数组来接受任意长度的参数就是用特性来作出来的)
其在编译期进行初始化而不是运行期;设计模式
几个习惯用法:
自定义特性必须直接或间接继承自System.Attribute类并且该类必需要有公有的构造函数;
自定义特性应该有一个Attribute后缀,习惯约定(在调用中能够省略,会自动匹配);
非抽象特性必需要有public访问权限;
定制特性不会影响应用元素的任何功能,只是约定了该元素具备的特质;数组
若是没有什么机制在运行期获取attribute的附加信息,那么attribute就没有什么存在的意义,所以 .net中用反射的机制来实如今运行期获取attribute信息;函数
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Method,AllowMultiple =true , Inherited = true)] (可应用屡次,不能够继承到派生类)
public class testAttribute : System.Attribute
{
public string name;
public testAttribute()
{ }
}
[test(name ="itis my first program")]
public class mytext
{
public void ok()
{
Console.WriteLine("my text word!");
}
}
class Program
{
static void Main(string[] args)
{
MemberInfo info = typeof(mytext); //或者对象名.GetType() 获得的其实是Type类型;
object []attribute;
attribute =info.GetCustomAttributes(typeof(testAttribute), true);
foreach (object a in attribute)
{
testAttribute x = (testAttribute)a;
Console.WriteLine(x.name );
} //获取对象的属性
(其实就是人为付在类体上面的一些说明);.net
Assembly d = Assembly.Load("Mscorlib");
Type[] types = d.GetTypes();
int i = 0;
foreach (Type a in types)
{
Console.WriteLine(a);
Console.Read();
i++;
}
Console.WriteLine(i.ToString ()); //查看一个程序集的内容设计
关于Type:
能够看做是一个类,但实际上时一个抽象的基类,type于每种数据类型都有对应的Type的派生类,通常派生的类只提供各类Tyep方法和属性的不一样重载,以返回对应数据类型的正确数据
获取指向给定类型的Type引用由3种方式:
·使用c#typeof运算符,参数是类型的名称;
·使用GetType()方法,全部类都会从object类中继承这个方法;(肯定该实例的类型)
·调用Type类的静态方法GetType();对象
type是许多反射技术的入口,可用的属性都是可读的,可使用Type肯定数据的类型,但不能修改该类型;
(整个反射机制的枢纽)继承
反射机制:
第一步:Assembly.Load("")/.LoadFrom("") 加载程序集;
第二步: a.调用.GetTypes(),返回全部该程序集中的类型;
b.或者调用特性静态方法Attribute.GetCustomAttributes(Assemble x) ,返回该程序集中全部包含的特性
(有一个重载的方法,第二个参数为指定特性的Type,即返回该程序集全部的该特性的集合)
第三步: a.调用Type的各类属性,如GetMethods()等,查找制定方法字段属性的 信息;
b.将特性转换为(显示)已知的特性,再调用特性的方法等;
第四步:用methodinfo 等直接调用GetCustomAttributes ()以得到与该方法有关的特性;ip