反射
概括:通过动态加载程序集,获取类型,创建对象,并调用成员。
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 }
效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构