反射:简单的理解就是动态调用程序集,通过类型元数据创建对象,调用对象的成员等.
1.反射无处不在,我们天天在使用,vs的智能提示,就是通过反射获取到类的属性、方法等,还有反编译工具也是通过反射实现。
2.反射:就是动态获取程序集中的元数据来操作类型的。
3.Type类实现反射的一个重要的类,通过它我们可以获取类中的所有信息,包括方法、属性等,可以动态调用类的属性、方法,Type是对类的描述,如何获取Person类中的所有属性?
4.反射就是直接通过.dll来创建对象,调用成员.
5.通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法,这个就叫做"反射".
通过P/Invoke调用其它语言写的dll文件
实例一:
class Program { static void Main(string[] args) { Person p = new Person(); Type type1 = p.GetType(); //获取当前实例 Type type2 = typeof(Person); //获取当前类型的父类,可以获取父类的父类 Console.WriteLine(type2.BaseType.ToString()); //Console.WriteLine(type2.BaseType.BaseType.ToString()); //获取当前类型中所有字段信息,这里只能获取私有字段 FieldInfo[] fields = type2.GetFields(); foreach (var item in fields) { Console.WriteLine(item.Name); } //获取当前类型中所有属性名称 PropertyInfo[] profInfo = type2.GetProperties(); foreach (var item in profInfo) { Console.WriteLine(item.Name); } Console.ReadKey(); } } class Person { public string field1; public string field2; public string Name { get; set; } public int Age { get; set; } public void SayHi() { Console.WriteLine("Hi"); } }
实例二:获取程序集里面的类、方法
//根据程序的路径,动态加载程序集 Assembly asm = Assembly.LoadFile(@"C:用户目录我的文档visual studio 2012ProjectsReflactReflactinDebugReflact.dll"); //获取该程序集的所有类型 Type[] type = asm.GetTypes(); foreach (var item in type) { Console.WriteLine(item.FullName); } //获取该程序集的所有public类型 Type[] type2 = asm.GetExportedTypes(); foreach (var item in type2) { Console.WriteLine(item.FullName); } //获取指定的类型 Type type = asm.GetType("Reflact.TestReflact"); //获取某个类型中的成员,调用 MethodInfo method = type.GetMethod("SayHi"); //创建一个TestReflact类型的对象 //根据指定的Type,创建一个该类型的对象 object obj = Activator.CreateInstance(type); //调用该方法 method.Invoke(obj, null); //调用相同方法名没有参数的方法 MethodInfo method2 = type.GetMethod("SayHello", new Type[] { }); method2.Invoke(obj, null); //调用相同方法名有参数的方法 MethodInfo method3 = type.GetMethod("SayHello", new Type[] { typeof(string) }); method3.Invoke(Activator.CreateInstance(type), new object[] { "张三" }); //如果方法有返回值的话,直接接收Invoke()方法的返回值就可以了
//string result = (string)method3.Invoke(Activator.CreateInstance(type), new object[] { "张三" });
Console.ReadKey();