C#_反射与特性
程序集

经过编译器编译得到的产物(.exe/.dll)
是自己写的代码集合

元数据

用来描述程序集的数据单元

反射

可以在程序运行时,可以查看其他程序集或者自身的元数据
提高了程序的拓展性和灵活性
using System.Reflection命名空间下
using System

Type【类的信息类】
Assembly【程序集类】
Activator【实例化对象的类】

.GetType();//在xx命名空间下的.xx
Type t=typeof(int);//在xx命名空间下的xx
Type.GetType();//【参数】System.Int32(需要包含命名空间)
以上的三种方法指向的是同一个引用内存地址

【得到所有的公共成员】:MemberInfo[] m=t.GetMembers();

【得到所有的构造方法】:ConstructorInfo[] info=t.GetConstructors();
【得到一个的构造方法】:ConstructorInfo info=t.GetConstructor(new Type[0]);【参数】有长度的Type类型数组,长度0则为无参构造。 info.Invoke();//【参数:null】执行得到的构造方法,返回object对象(需要as得到引用对象)
【得到有参的构造方法】:ConstructorInfo info=t.GetConstructor(new Type[]{typeof(int)}); //一个int类型的构造方法;info.Invoke(new Type[]{2}); //【参数】传入2返回object对象(需要as得到引用对象){同理:两个参数的构造函数时,需要按照顺序typeof(int),typeof(string)}
【得到所有的成员变量】:FieldInfo[] f=t.GetFields();
【得到一个成员变量】:FieldInfo f=t.GetField("age");//【参数】变量名得到引用
【得到成员变量的内容】:f.GetValue(obj);//【参数】为该变量类型的实例
【设置成员变量的内容】:f.SetValue(obj,10);//【参数】1.实例2.更改obj的值,若[枚举则为.GetValue(null),先得成员后访问]
【得到公共的成员方法】:Method[] f=t.GetMethods();//得到对应有参数的成员方法和构造方法的方式一致
【得到一个成员方法】:Method f=t.GetMethod("FunName");//【参数】方法名得到引用,f.Invoke(类型实例(如果为静态方法为null),new Type[]{10,10});
【枚举、事件、接口】

Activator实例化
得到Type t=typeof(MyClass);
Activator.CreateInstance(t);//【参数】为对象信息类,返回object对象(需要as)默认为无参构造
Activator.CreateInstance(t,2,“222”);//【参数】为对象信息类,返回object对象(需要as)默认为无参构造,后面为对应参数,不对应则报错
Assembly【程序集类】
Assembly asem= Assembly.Load();//同个工程文件下程序集名称
Assembly asem= Assembly.LoadFrom();//加载指定路径下的.dll【使用@取消转移字符或者\\】用Type[]进行装置遍历
Assembly asem= Assembly.LoadFile();

特性

What
是一种允许我们向程序的程序集添加一些元数据的语言结构,用于保存程序结构信息的某种特殊类型的类
提供了强大的方法声明信息与代码的其他元数据相关联,可以在运行时使用反射来查询特性的相关信息描述
目的是提供编译器把某些元数据进行特殊处理,本质是一个类
Why
提供某些特殊需求
How
【定义】该类需要继承Attribute才能自定义特性名字后面需亚添加Attribute表示是特性,在使用时Attribute会被省略
【调用】
[MyTest("特性测试")],判断Type对象有没有有没有对应的特性,t.IsDefined(typeof(自定义的特性类名),bool是否搜索继承链)//可以传成员等
t.GetCustomAttribues(ture)//获取元数据中的所有特性 返回object对象数组可以遍历去判断做特殊处理(as 为对应的类进行调用对应的成员)
【限定使用范围】为特性类再加[AttributeUsage()][参数]1.可以使用在哪里可以用位运算符进行处理2.是否多个特性实例用在同一个目标上3.特性是否能被派生类重写和继承
【过时特性】[obsolete("该方法已经过时,请使用GetAaxis方法",bool调用是否会报错)]
【调用者信息特性】一般用在处理异常的Try中,System.Runtime.CompilerServices;
【条件编译特性】[Conditional("Fun")]System.Diagnostic,结合#define Fun进行使用,主要用在调试代码
【外部Dll包特性】System.Runtime.InteropServices;//调用C/C++写好的函数,[DllImport(“路径.dll”)]
public static extern int Add(int a,int b);//进行函数映射