反射

概括:通过动态加载程序集,获取类型,创建对象,并调用成员。

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     }

效果:

原文地址:https://www.cnblogs.com/chenyanbin/p/11001028.html