泛型和反射
泛性:就是类的一个参数(类的参数必须是一个类,不能是对象),也就是一个类型占位符
为什么有泛性:
实现算法的重用
避免装箱拆箱
类型安全,编译时会自动检测参数类型
泛性类型: 泛型类/泛型接口/泛型委托/泛型方法
带约束的泛型: publlic class c1 <T> where T:int{ }
程序集: 某个项目中所有的代码以及嵌入式资源(图片,声音等)的集合,以及程序集清单(对程序集的描述,版本,密钥等);
GAC: 全局程序集缓存 公用的Assembly放到GAC中
Assembly类是对程序集的描述
AppDomain.CurrentDomain.GetAssemblies() 获得当前程序所有的Assembly
Assembly.LoadFile() 动态从文件加载Assembly 不需要在编译的时候引用
反射:
通过反射可以读取物理文件程序集内的代码内容
可以根据类名字符串来动态的创建类的对象
可以在程序运行时,动态的获得对象里的信息,如(方法/属性/字段/索引等)
可以根据成员名称字符串来调用执行对象里对应的成员
反射: 在运行时,获得某个对象的成员,进一步可以动态的调用此对象的方法
在运行时,根据某个类型信息字符串,动态的创建对象
当加载某个程序集文件时,会将程序集中的类型信息及所有成员信息,放在一个Type类对象中
//加载程序集
Assembly ass = Assembly.LoadFile(dllPath);
//根据类名创建实例
object o = ass.CreateInstance(className);
Activator.CreateInstance(Type t) 会动态调用类的无参构造函数创建t的一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
Type类 可以叫做类的类,用来保存某个类里的成员信息的集合
Assembly.GetExecutingAssembly().Location; //获取当前正在执行程序集的物理路径
Assembly.ase = Assembly.LoadFrom("程序集物理路径");
Type type = ase.getType(); Type type = typeof(className);
object obj = Activator.CreateInstance(type); //创建type的实例
FildInfo [] fis = type.GetFilds(); //获取obj中的所有字段信息
MethodInfo [] mis = type.GetMethods(); //获得obj中的所有方法的信息
PropertyInfo [] pi = type.GetProperties(); //获得obj中的所有属性的信息
MethodInfo [] mi = type.GetMethod(methodName); //获得obj中的指定方法
GetMethod方法默认一个string参数的方法只能获得没有重载方法的方法,要获得重载方法要用GetMethod(string name, Type[] types)这个重载函数,第二个参数是匹配方法的参数类型数组
mi.invoke(obj,null); //调用方法 null表示没有参数
PropertyInfo [] pi = type.GetProperty(); //获得obj中的指定属性
CanRead、CanWrite、判断属性能否读写
PropertyType属性的类型
SetValue()、GetValue():读取值,设置值,第一个参数是实例对象,因为set、get要针对具体实例,最后一个参数null。
Type、MethodInfo都是和具体对象不相关的,所以需要第一个参数指定要执行的对象
GetConstructor(获得构造函数)、
GetEvent(获得事件)、
bool IsAssignableFrom(Type t):(直译:是否可以从c赋值)判断当前的类型的变量是不是可以接受t类型变量的赋值。
typeAnimal.IsAssignableFrom(typeDog); //判断dog是否继承于animal,也就是判断dog是否可以被强转为animal
bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)
bool IsSubclassOf(Type c):判断当前类是否是类c的子类。(只能判断类间的继承,如果是接口则返回fase)
调用private方法
type.GetMethod("methodName",BindingFlags.NonPublic|BindingFlags.Instance);
在为A项目添加B项目引用的时候
如果使用项目选项卡添加,则A项目的bin目录下会导入B项目的程序集文件,同时,还会在A项目的项目文件中保存B项目正对于A项目的相对路径,那么当B项目发生修改时,重新生成新的程序集后,会自动替换掉A项目里原来的B项目的程序集
如果使用浏览选项卡添加,则只将B项目的程序集一次性添加到A项目的bin目录下,当B项目发生修改重新生成新的程序集后,不会自动更新A项目中的B项目程序集
浙公网安备 33010602011771号