1.什么是反射
1.在内存中操作一个程序集,在运行的过程中无法进行调试
2.程序集是编译器生成的,程序集里面有中间代码(MSIL),让即时编译器用的(CLR),再交给机器码,再加给CPT运行
3.解耦
4.元数据:描述此程序集中有哪些类,类中有哪些成员,不包括具体的方法体。描述一个程序集的清单
5.现个进程为什么不能访问,是因为通过应用程序域来管理的
2.为什么需要反射
答:在项目中不能添加程序集(dll),但是又要在项目中调用.dll程序集中某个类中的方法,属性,字段...这种需要可以使用反射来操作
1.加载程序集的几种方式
1.自动扫描当前运行项目的bin\debug ,网站是扫描bin目录 下的Lib.dll程序集 (常用)
1.Assembly.Load("Lib");
2.指定一个绝对路径加载程序集
1.Assembly.LoadFile
2.Assembly.LoadFrom
3.获得当前 程序域中 所有的Assembly,包括GAC中的程序集
1.AppDomain.CurrentDomain.GetAssemblies();
4.可以直接通过this来获取
1.this.GetType().Assembly;
5. typeof(Form1).Assembly
2.获取类的几种方式
1.获取指定类的类型 ass.GetType("Lib.Pig");
2.获取当前所有的类(包括公有和非有) ass.GetTypes();
3.忽略类的全名的大小写 ass.GetType("Lib.pig", false, true);
4.可以typeof()关键字来获取 typeof(Form1);
5.可以通过实例的GetType()
Type type5 = this.GetType(); Form1 f1 = new Form1(); Type type6 = f1.GetType();
3.操作类中的字段
1.获取私有字段
pigtype.GetField("_name", BindingFlags.NonPublic | BindingFlags.Instance);
BindingFlags.NonPublic | BindingFlags.Instance:表示获取一个非共有的实例字段,一定是组合使用
BindingFlags.NonPublic | BindingFlags.Static:表示获取一个非共有的静态字段 ,一定是组合使用
####2.给_name字段赋值
object instance = ass.CreateInstance("Lib.Pig");
nameInfo.SetValue(instance, "八戒");
3.获取instance中的_name字段值
object retVal = nameInfo.GetValue(instance);
MessageBox.Show(retVal.ToString());
4.操作类的方法
1.获取方法
pigType.GetMethod("Eat", BindingFlags.Public | BindingFlags.Instance);
2.调用方法
mInfo.Invoke(instance, new object[] { "八戒", 500 });
5.实例化对象
1. Assembly ass = Assembly.Load("Lib");
ass.CreateInstance("Lib.Pig");
2. Type pigType = ass.GetType("Lib.Pig");
Activator.CreateInstance(pigType);//要求:必须要求类拥有无参的构造函数,否则报错
3. ConstructorInfo cinfo = pigType.GetConstructor(new Type[] { typeof(string) });
object pigInstance = cinfo.Invoke(new object[] { "八戒11" }); //new Pig("八戒",500)
4. /获取pigInstance中的Name的值
PropertyInfo nameInfo = pigType.GetProperty("Name");
object res = nameInfo.GetValue(pigInstance)
6.Type类型中重要方法
Assembly ass = Assembly.Load("Lib");
Type pigType = ass.GetType("Lib.Pig");
//获取程序集的绝对路径
//pigType.Assembly.Location
//pigType .FullName //Lib.Pig
//pigType.Name// Pig
//1.0 判断Pig类是否实现了Ipig接口
//1.0.1 获取IPig接口的Type
Type ipigType = ass.GetType("Lib.IPig");
//1.0.2 判断pigType是否实现了ipigType
bool isok = ipigType.IsAssignableFrom(pigType); //true
//2.0 判断Pig类是否继承了Basepig类
Type basepigType = ass.GetType("Lib.BasePig");
bool isext = pigType.IsSubclassOf(basepigType); //true
//3.0 object instance=new Pig();
object instance = ass.CreateInstance("Lib.Pig");
pigType.IsInstanceOfType(instance); //true
网友评论