标签:
反射的基本概念
Type类实现反射的一个重要的类,通过它我们可以获取类中的所有信息包括方法、属性等。可以动态调用类的属性、方法。
1,Type是对类的描述。如何获取Person类中的所有方法和属性?
Person p = new Person(); Type tp = p.GetType();//获取当前实例的类型; typeof(Person); //获取该Person中所有的方法 MethodInfo[] methes = tp.GetMethods(); for (int i = 0; i < methes.Length; i++) { Console.WriteLine(methes[i].Name); } Console.WriteLine("================="); //获取所有的属性 PropertyInfo[] ptyInfos = tp.GetProperties(); for (int i = 0; i < ptyInfos.Length; i++) { Console.WriteLine(ptyInfos[i].Name); } Console.ReadKey();
2,如何调用一个程序集的方法和属性?
调用Assembly的GetExportedTypes方法可以得到Assembly中定义的所有的public类型。
调用Assembly的GetTypes()方法可以得到Assembly中定义的所有的类型。
调用Assembly的GetType(name)方法可以得到Assembly中定义的全名为name的类型信息。
string path = @"E:\百度云同步盘\Study\Net_Chapter08_NetAdvanced\NetAdvanced\MyClass\bin\Debug\MyClass.dll"; Assembly ass = Assembly.LoadFile(path);//加载指定路径上程序集文件的内容 Type[] tps = ass.GetExportedTypes();//根据拿到的程序集内容,获取公共类型 for (int i = 0; i < tps.Length; i++) { Console.WriteLine(tps[i].Name); MethodInfo[] ms = tps[i].GetMethods(); for (int j = 0; j < ms.Length; j++) { Console.WriteLine(ms[j].Name);
}
}
Console.ReadKey();
通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法等,这个就叫做“反射”。
Type类的几个常用方法:
Activator.CreateInstance(Type t)会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
GetConstructor(参数列表);//这个是找到带参数的构造函数。
Type类四个方法:在编写调用插件的程序时,需要做一系列验证。
Type tpPerson = ass.GetType("MyClasses.Person"); Type tpStudent = ass.GetType("MyClasses.Student"); Type tpAnimal = ass.GetType("MyClasses.Animal"); Console.WriteLine(tpAnimal.IsAbstract); Type tpIFly = ass.GetType("MyClasses.IFly"); Console.WriteLine(tpIFly.IsAbstract); //tpStudent是tpPerson的子类--判断 bool result = tpStudent.IsSubclassOf(tpPerson); Console.WriteLine(result); //obj是否是tpPerson的一个实例 object obj = Activator.CreateInstance(tpStudent); bool result1 = tpPerson.IsInstanceOfType(obj); Console.WriteLine(result1); //tpStudent能不能赋值给tpPerson bool r = tpPerson.IsAssignableFrom(tpStudent); Console.WriteLine(r); object ob = Activator.CreateInstance(tpPerson); bool r1 = tpPerson.IsInstanceOfType(ob); Console.WriteLine( r1);
标签:
原文地址:http://www.cnblogs.com/sean100/p/4639354.html