//0、动态加载 程序集 文件 利用Assembly类
Assembly assembly = Assembly.LoadFile("c: est.dll"); Type[] type = assembly.GetTypes(); //私有,公有所有类都能获取到 Type type_single = assembly.GetType("test.person"); //只拿到 指定的类 参数为“完全限定名称”。即 命名空间.类名 Type[] type_public = assembly.GetExportedTypes(); //只获取 公有 类型
//1、获取Type类型 两种方式
Person p=new Person (); Type type1 = p.GetType(); //当有对象的时候 使用GetType Type type2 = typeof(Person);//当没有对象的时候 使用typeof
//2、获取类型元数据 中的所有方法 (获取所有Public方法。包括属性方法和父类继承下来的方法。不包括私有方法。要获取私有方法需要使用其他方式)
MethodInfo[] methods=type2.GetMethods(); for (int i = 0; i < methods.Length; i++) { Console.WriteLine(methods[i].Name.ToString()); }
//调用方法 第一个参数需要通过反射创建对象
MethodInfo method_single = type2.GetMethod("SayHi"); //如果方法重载 则需要type2.GetMethod("SayHi",new Type[]{typeof(int),typeof(string)}) object obj = Activator.CreateInstance(type2); //第一个参数 object result = method_single.Invoke(obj, new object[] { 100, 200 }); //利用Invoke方法 带参数调用,不带参数 method_single.Invoke(obj,null);
//3、获取 类型元数据 中的所有属性
PropertyInfo[] properties= type2.GetProperties(); for (int i = 0; i < properties.Length; i++) { Console.WriteLine(properties[i].Name.ToString()); } //属性赋值 PropertyInfo property = type2.GetProperty("Name"); object obj2 = Activator.CreateInstance(type2); //第一个参数 property.SetValue(obj2,"刘志新",null); property.GetValue(obj2, null);//获取属性
//4、获取 类型元数据中 所有字段 (私有的获取不到)
FieldInfo[] fields=type2.GetFields(); for (int i = 0; i < fields.Length; i++) { Console.WriteLine(fields[i].Name.ToString()); }
//5、类中还有好多的东东,都可以通过.get 来获取。自己看吧