纵有疾风起,人生不言弃
可以通过类名、成员的名字来进行对象的实例化、操作类成员
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
class Person{ public int a; private int b; public static int c; private static int d; public Person(){ Console.WriteLine("Person 类无参构造方法被调用"); }; public Person(int a, double b, string c){ Console.WriteLine("Person 类有参构造方法被调用"); }; public void ShowA(){}; private void ShowB(){}; public static void ShowC(){}; private static void ShowD(){}; public int Show(int a, double b){ return a;}; public double Show(double a, int b){ return b;};}class Program{ public static void Main(string[] args){ //如果类在命名空间中,类名必须加上命名空间 Type t = Type.GetType("命名空间.Person"); //实例化一个对象,默认会使用 public 权限的无参构造方法 Object obj = Activator.CreateInstance(t); //实例化一个对象,如果 true 可以匹配任何权限的无参构造方法 Object obj = Activator.CreateInstance(t, true); //实例化一个对象,通过 public 权限的有参构造方法 Object obj = Activator.CreateInstance(t, 1, 3.2, "hello"); //实例化一个对象,通过非 public 权限的有参构造方法 Object obj = Activator.CreateInstance(t, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, new object[]{1, 3.2, "hello"}, null); /* * BindingFlags:要访问的方法和字段的权限描述,必须具备两个描述 * 1、要访问的成员的访问权限描述 * 2、要访问的成员的归属 */ //通过反射访问字段、方法 //1、public 权限,非静态的字段a FieldInfo a = t.GetField("a"); a.SetValue(obj, 1); //给 obj 对象赋值 1 object aa = a.GetValue(obj); //获取 obj 对象 a 的值 //2、private 权限,非静态的字段b FieldInfo b = t.GetField("b", BindingFlags.NonPublic | BindingFlags.Instance); b.SetValue(obj, 3); //给 obj 对象赋值 3 object bb = b.GetValue(obj); //获取 obj 对象 b 的值 //3、public 权限,静态的字段c FieldInfo c = t.GetField("c", BindingFlags.Public | BindingFlags.Static); c.SetValue(null, 3); //访问静态成员,访问的主体是 null object cc = c.GetValue(null); //4、private 权限,静态的字段d FieldInfo d = t.GetField("c", BindingFlags.NonPublic |BindingFlags.Static); d.SetValue(null, 3); //访问静态成员,访问的主体是 null object dd = d.GetValue(null); MethodInfo method1 = t.GetMethod("ShowD", BindingFlags.NonPublic | BindingFlags.Instance); //方法调用,第一个参数:谁在调用方法;第二个参数:调用的方法的实参列表 method1.Invoke(null, null); //获取有参数有重载的方法,Type数组中传要访问的方法的参数类型列表 MethodInfo method2 = t.GetMethod("Show", BindingFlags.Public | BindingFlags.Instance, null, new Type[]{ typeof(int), typeof(double)}, null); object res = method2.Invoke(obj, new Type[]{1, 3.12}); }}