概括:通过动态加载程序集,获取类型,创建对象,并调用成员。
Type类是实现反射的一个重要的类,通过它我们可以获取类中的所有信息包括方法、属性等。
1、获取一个类型的Type(该类型的类型元数据)
方式一:
1 private void button1_Click(object sender, EventArgs e) 2 { 3 MyClass m = new MyClass(); 4 Type t = m.GetType(); //获取了类型MyClass对应的Type 5 }
1 public class MyClass 2 { 3 public string Name { get; set; } 4 public void Say() 5 { 6 MessageBox.Show("Hi"); 7 } 8 }
方式二:
1 private void button1_Click(object sender, EventArgs e) 2 { 3 Type t = typeof(MyClass); //通过Typeof关键字,无需获取MyClass类型的对象就可以拿到MyClass的Type对象 4 }
1 public class MyClass 2 { 3 public string Name { get; set; } 4 public void Say() 5 { 6 MessageBox.Show("Hi"); 7 } 8 }
2、获取当前类型的父类是谁?
1 private void button1_Click(object sender, EventArgs e) 2 { 3 Type t = typeof(MyClass); 4 MessageBox.Show(t.BaseType.ToString()); 5 }
1 public class MyClass 2 { 3 public string Name { get; set; } 4 public void Say() 5 { 6 MessageBox.Show("Hi"); 7 } 8 private void SayHell() 9 { 10 MessageBox.Show("Hello"); 11 } 12 }
3、获取当前类型中的所有的字段信息
1 private void button1_Click(object sender, EventArgs e) 2 { 3 Type t = typeof(MyClass); 4 MessageBox.Show(t.GetField("arrStr").ToString()); //获取指定的字段 5 FieldInfo[] fileds = t.GetFields(); //获取所有的字段信息 6 for (int i = 0; i < fileds.Length; i++) 7 { 8 MessageBox.Show(fileds[i].ToString()); 9 MessageBox.Show(fileds[i].Name.ToString()); //获取当前成员的名称 10 MessageBox.Show(fileds[i].IsStatic.ToString()); //获取当前成员是否static修饰 11 MessageBox.Show(fileds[i].ReflectedType.Name.ToString()); //获取类的名字 12 MessageBox.Show(fileds[i].IsPublic.ToString()); //获取当前成员是否public修饰 13 MessageBox.Show(fileds[i].IsPrivate.ToString()); //获取当前成员是否private修饰 14 MessageBox.Show(fileds[i].FieldType.ToString()); //获取字段类型 15 MessageBox.Show(fileds[i].DeclaringType.ToString()); //获取声明该成员的类名称 16 } 17 }
1 public class MyClass 2 { 3 public string[] arrStr; 4 public int Age { get; set; } 5 public string Name { get; set; } 6 public void Say() 7 { 8 MessageBox.Show("Hi"); 9 } 10 private void SayHell() 11 { 12 MessageBox.Show("Hello"); 13 } 14 }
4、获取所有属性
1 private void button1_Click(object sender, EventArgs e) 2 { 3 Type t = typeof(MyClass); 4 PropertyInfo[] infos = t.GetProperties(); 5 for (int i = 0; i < infos.Length; i++) 6 { 7 MessageBox.Show(infos[i].Name.ToString()); //获取字段属性的名称 8 MessageBox.Show(infos[i].GetMethod.ToString()); //获取此属性的get访问器 9 MessageBox.Show(infos[i].CanRead.ToString()); //获取一个值,该值属性是否只读 10 MessageBox.Show(infos[i].CanWrite.ToString()); //获取一个值,该值属性是否只写 11 MessageBox.Show(infos[i].PropertyType.ToString()); //获取此属性的数据类型 12 } 13 }
1 public class MyClass 2 { 3 public string[] arrStr; 4 public int Age { get; set; } 5 public string Name { get; set; } 6 public void Say() 7 { 8 MessageBox.Show("Hi"); 9 } 10 private void SayHell() 11 { 12 MessageBox.Show("Hello"); 13 } 14 }
5、获取程序集中的所有类型
1 private void button1_Click(object sender, EventArgs e) 2 { 3 //根据程序的路径,动态加载程序集 4 Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll"); 5 Type[] types = asm.GetTypes(); 6 for (int i = 0; i < types.Length; i++) 7 { 8 MessageBox.Show(types[i].FullName); 9 } 10 }
6、获取所有的public类型
1 private void button1_Click(object sender, EventArgs e) 2 { 3 //根据程序的路径,动态加载程序集 4 Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll"); 5 Type[] types = asm.GetExportedTypes(); 6 for (int i = 0; i < types.Length; i++) 7 { 8 MessageBox.Show(types[i].FullName); 9 } 10 }
7、获取指定的Person类,并调用该类中的SayHi方法
1 private void button1_Click(object sender, EventArgs e) 2 { 3 //根据程序的路径,动态加载程序集 4 Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll"); 5 Type typePerson = asm.GetType("Person.Person"); //命名空间.类名 6 //获取该类中的SayHi方法 7 MethodInfo method = typePerson.GetMethod("SayHi"); 8 //创建一个Person类型的对象 9 //根据制定的Type,创建一个该类型的对象 10 object obj = Activator.CreateInstance(typePerson); 11 //调用该方法 12 method.Invoke(obj,null); //第一个参数:类的实例化对象;第二个参数:方法的参数列表 13 }
Person类:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Windows.Forms; 7 8 namespace Person 9 { 10 public class Person 11 { 12 public string Name { get; set; } 13 public int Age { get; set; } 14 public string Email { get; set; } 15 public void SayHi() 16 { 17 MessageBox.Show("Hi"); 18 } 19 public void SayHello(string name) 20 { 21 MessageBox.Show("Hello" + name); 22 } 23 public int Add(int n1,int n2) 24 { 25 return n1 + n2; 26 } 27 } 28 public interface IFlyable 29 { 30 void Fly(); 31 } 32 internal class Teacher : Person 33 { 34 35 } 36 public class MyClass : IFlyable 37 { 38 public void Fly() 39 { 40 throw new NotImplementedException(); 41 } 42 } 43 struct MyStruct1 44 { 45 46 } 47 public class Student : Person 48 { 49 50 } 51 public delegate void MyDelegate(); 52 public enum MyEnum 53 { 54 55 } 56 }
效果
8、获取指定的Person类,并调用该类中无参数的SayHi方法重载
1 private void button1_Click(object sender, EventArgs e) 2 { 3 //根据程序的路径,动态加载程序集 4 Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll"); 5 Type typePerson = asm.GetType("Person.Person"); //命名空间.类名 6 //获取该类中的SayHi方法 7 MethodInfo method = typePerson.GetMethod("SayHi",new Type[] { }); 8 //创建一个Person类型的对象 9 //根据制定的Type,创建一个该类型的对象 10 object obj = Activator.CreateInstance(typePerson); 11 //调用该方法 12 method.Invoke(obj,null); 13 }
9、获取指定的Person类,并调用该类中有参数的SayHi方法重载
1 private void button1_Click(object sender, EventArgs e) 2 { 3 //根据程序的路径,动态加载程序集 4 Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll"); 5 Type typePerson = asm.GetType("Person.Person"); //命名空间.类名 6 //获取该类中的SayHi方法 7 MethodInfo method = typePerson.GetMethod("SayHi",new Type[] {typeof(string) }); 8 //创建一个Person类型的对象 9 //根据制定的Type,创建一个该类型的对象 10 object obj = Activator.CreateInstance(typePerson); 11 //调用该方法 12 method.Invoke(obj,new object[]{ "Alex"}); 13 }
10、如果调用方法有返回值,直接接受Invoke方法的返回值即可
1 private void button1_Click(object sender, EventArgs e) 2 { 3 //根据程序的路径,动态加载程序集 4 Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll"); 5 Type typePerson = asm.GetType("Person.Person"); //命名空间.类名 6 //获取该类中的SayHi方法 7 MethodInfo method = typePerson.GetMethod("SayHi",new Type[] {typeof(string) }); 8 //创建一个Person类型的对象 9 //根据制定的Type,创建一个该类型的对象 10 object obj = Activator.CreateInstance(typePerson); 11 //调用该方法 12 object result = method.Invoke(obj,new object[]{ "Alex"}); 13 }
11、通过调用指定的构造函数来创建对象,并获取指定对象的属性的值
1 private void button1_Click(object sender, EventArgs e) 2 { 3 //根据程序的路径,动态加载程序集 4 Assembly asm = Assembly.LoadFile(@"G:fansheWindowsFormsApplication1PersoninDebugPerson.dll"); 5 Type typePerson = asm.GetType("Person.Person"); //命名空间.类名 6 //通过调用指定的构造函数来创建对象 7 ConstructorInfo info = typePerson.GetConstructor(new Type[] { typeof(string),typeof(int),typeof(string)}); 8 //调用构造函数,来创建对象 9 object obj = info.Invoke(new object[] {"alex",15,"alex@163.com"}); 10 //通过反射获取指定对象的属性的值 11 PropertyInfo pInfo = typePerson.GetProperty("Name"); //属性名 12 string name = pInfo.GetValue(obj, null).ToString(); //获取值,第一个参数:构造函数的实例化对象;第二个参数:索引器 13 MessageBox.Show(name); 14 }
Person类:
1 public class Person 2 { 3 public Person() 4 { 5 6 } 7 public Person(string name,int age,string email) 8 { 9 this.Name = name; 10 this.Age = age; 11 this.Email = email; 12 } 13 public string Name { get; set; } 14 public int Age { get; set; } 15 public string Email { get; set; } 16 public void SayHi() 17 { 18 MessageBox.Show("Hi"); 19 } 20 public void SayHello(string name) 21 { 22 MessageBox.Show("Hello" + name); 23 } 24 public int Add(int n1,int n2) 25 { 26 return n1 + n2; 27 } 28 }
效果: