概括:通过动态加载程序集,获取类型,创建对象,并调用成员。
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:\fanshe\WindowsFormsApplication1\Person\bin\Debug\Person.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:\fanshe\WindowsFormsApplication1\Person\bin\Debug\Person.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:\fanshe\WindowsFormsApplication1\Person\bin\Debug\Person.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:\fanshe\WindowsFormsApplication1\Person\bin\Debug\Person.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:\fanshe\WindowsFormsApplication1\Person\bin\Debug\Person.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:\fanshe\WindowsFormsApplication1\Person\bin\Debug\Person.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:\fanshe\WindowsFormsApplication1\Person\bin\Debug\Person.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 }
效果:
