通过动态获取程序集,并获取其中的类型元数据,然后访问该类型的过程。
反射中一个重要的类型就是Type
一,反射获取同一程序集中的数据
1,当没有对象的使用的这种方式来获取某个类型的Type
Type type = typeof(Person);
2,当已经获得对象后可以使用对象的GetType()方法来获取指定对象的类型的Type对象
1)获取type类型的类
Person p = new Person();
Type personType = p.GetType();
2)获取Person类中的所有方法
Methodinfo[] methods =personType.GetMthods();
methods[]类中的所有方法
遍历输出每个方法的方法名
for(int i = 0;i<methods.Length;i++)
{
methods[i].name ; //方法名称
}
注:通过method[i]可以调用不同的方法来查看该类型,通过GetMthods可以获取指定类型的所有的方法其中包括编译器自动生成的方法以及从父类中继承来的方法,但不包含private方法,需获取private方法,需要使用其他方式
3)获取某个类型的所有属性
PropertyInfo[] properties = personType.GetProperties();
4)获取类中的所有字段,私有字段无法获取
FieldInfo[] fields =personType.GetFields();
5)获取所有成员,不包含私有成员
MemberInfo[] members = personType.GetMembers();
二,反射获取另外一个程序集中的类型
1)动态加载.dll(.exe)文件
Assembly assembly = Assembly.LoadFile(dll路径);//dll路径:完整路径
2)获取程序集类型
1,获取加载的程序集中类型
//assembly.GetType() //typeof(Assembly),不能获取某个程序集中的所有类型
Type[] types = assembly.GetTypes();//获取所有类型,包括private,public等等
Type[] types = assembly.GetExportedTypes(); //只获取public类型
2,获取指定类的Type
Type personType = assembly.GetType("完整类名称") //TestDll.Person
注:GetType()方法有重载,选择第二个重载,参数表示要获取的类型的"完全限定名称",即:命名空间.类名
3,获取特定的某个方法:PersonType.GetMethod();//参数:要获取的方法名
MethodInfo method = PersonType.GetMethod("MethodName");
4,通过反射来创建一个Person类型的对象(其实就是通过Person的Type来创建一个Person对象)
object objPerson =Activator.CreateInstance(personType);
5,使用类中的方法
method.Invoke(objPerdon,null);
参数1:
创建一个对象
参数2:
参数列表
无参数:
用null
有参数:
new Object[]{参数}
返回值:
通过object 接收
调用一个无参无返回值的方法:
method.Invoke(objPerdon,null);
调用带参数,带返回值的方法
Object result = method.Invoke(objPerdon,new Object[]{100,200}); //参数顺序和定义的时候一样
result:方法的返回值
调用重载的方法:
1.找到对应的方法
MethodInfo method=PersonType.GetMethod("MethodName",new Type[]{typeof(int),typeof(int),typeof(string)});
参数说明:
参数1:方法的名称
参数2:方法中的参数个数及类型,用于重载找到方法
2.调用与前面的一样
反射获取类的属性,并赋值
1.获取属性
PropertyInfo property = personType.GetProperty("属性名");
2.为属性赋值
Object obj = Activator.CreateInstance(personType);
property.SetValue(obj,"value",null);
3.获取属性值
string name = property.GetValue(obj,null).ToString();
构造函数
手动查找类型的构造函数,并且调用该构造函数来创建类型的对象
1,查找构造函数
ConstructorInfo ctor = personType.GetConstructor(new Type[]{typeof()});
2,调用构造函数
object obj = ctor.Invoke(new object[]{"参数1","参数2","参数3"});
Type总结:
1.获取给定类型的Type
使用typeof运算符,如Type t = typeof(int);
使用GetType()方法,如int i;Type t = i.GetType();
使用Type类的静态方法GetType(),如Type t =Type.GetType("System.Double");
2.Type的属性:
Name:数据类型名;
FullName:数据类型的完全限定名,包括命名空间;
Namespace:数据类型的命名空间;
BaseType:直接基本类型;
UnderlyingSystemType:映射类型;
3.Type的方法:
GetMethod():返回一个方法的信息;
GetMethods():返回所有方法的信息。
总结语:反射主要是通过Type这个类来获取要调用的程序集的方法,属性,字段,获取该类型后,像使用类的调用一样使用就可以。
浙公网安备 33010602011771号