什么是反射?
让程序在运行的时候能动态获取程序中的类或者其他详细信息。
1、获取程序集信息
方法一:Assembly assembly = Assembly.LoadFile(@"D:\133\121\绝对路径 ")
方法二:Assembly assembly = Assembly.LoadFile("程序集名.后缀名");//只能在当前运行文件的Dbug文件下面找。
Cosole.WriteLine(“程序名称”+assembiy.FullName);
Cosole.WriteLine(“程序集位置”+assembiy.Location);
2、获取类,通过模块和程序集都可以
Type Types = assembly.GetTypes();
foreach (type item in types)
{
Cosole.WriteLine(“类型名称”+item.Name);
Cosole.WriteLine(“类型的完全命名”+itme.FullName);
Cosole.WriteLine(“类型的类别”+itme.Location);
}
3、获取主要的类的成员信息
Type student = assembly.GetType("完全名")(完全名=类名+命名空间);
MemberInfo[] mi = student.GetMembers(); //获取里面的成员(数组) Member =>方法
foreach(MemberInfo itme in mi)
{
Cosole.WriteLine(“成员名称”+itme.Name);
Cosole.WriteLine(“成员类别”+itme.MemberType);
}
4、declare =>声明
BindingFlags flages = BngdingFlags.public | BingdingFlags.DesclaredOnly | BingdingFlags.Instance; //约束:获取哪种类型的方法 这里指的是获取自己定义的实例的公开的方法(非公开的私有的为Nonpublic)
(1
MemberInfo[] mi = student.GetMembers(flages); //获取方法
(2
PropertyInfo[] pi = Student.GetProperties(flages)//获取属性(数组)
(3
FieldInfo[] fieldlnfos = Student.GetFields(flages) //获取字段
5、在当前程序集中,获取Type的四种方式
(1 Type student = assembly.GetType("完全名") 前提是有程序集对象
(2 Type student = Type.GetType("完全名") 只能获取自己程序集里面的Type
(3 Type student = typeof(类);必须拥有该类型的引用
(4 Student student = new Student
type studentA = student.GetType();
5、使用反射创建对象
Type student = typeof(类);
Object entity = Activator.CreateInstance(student);
使用反射去调用方法
MethodInfo methodInfo = student.GetMethod("方法名");
//调用
methodInfo.Invoke(entity,new object[]{ 参数 }); --可以接收返回值
6、用反射给属性赋值
PropertyInfo[] propName = Student.GetProperty(”属性名“)//获取属性(数组)
propName.SetValue(对象,"要赋的值") --当前对象为entity
7、获取私有方法需要加上这个
BindingFlags flages = BngdingFlags.Nonpublic | BingdingFlags.DesclaredOnly | BingdingFlags.Instance;
8、给字段赋值
FieldInfo fieldInfo = Student.Getfield("字段名");
fieldInfo.SetValue(对象,”要赋的值“)
object 返回的值= fieldInfo.GetValue(对象)