反射是C#在运行时动态查看、检查和操作类型及成员的能力,依赖System.Type等类实现,关键在于“运行时”和“动态”,支持加载程序集、创建实例、调用方法;常用Type获取方式包括typeof、GetType()、Type.GetType()和Assembly.GetType();可通过GetMethods()等方法发现成员并用BindingFlags筛选;支持Activator.CreateInstance()创建对象、Invoke()调用方法、GetValue()/SetValue()读写属性或字段;但性能较低,需注意异常处理、权限限制及混淆影响。

反射是C#在运行时查看、检查甚至操作类型、方法、属性、字段等元数据的能力。它不依赖编译期已知的类型,而是通过 System.Type 和相关类,在程序执行中动态发现和调用成员。关键在于“运行时”和“动态”——你不需要提前写死类名或方法名,也能加载程序集、创建实例、调用方法。
获取Type对象的几种常用方式
要使用反射,第一步是拿到 Type 实例:
-
typeof(MyClass)—— 编译期已知类型,最轻量、推荐用于本程序内类型 -
obj.GetType()—— 对已有实例获取其实际运行时类型(支持多态) -
Type.GetType("Namespace.ClassName")—— 通过完整字符串名称获取,需注意命名空间+程序集限定(如未指定,默认只查当前程序集) -
Assembly.GetExecutingAssembly().GetType("...")—— 显式从指定程序集中查找,适合插件或外部DLL场景
查看类型结构:成员发现与筛选
拿到 Type 后,可用一系列 GetXXX() 方法列出成员:
-
type.GetMethods()返回所有公共方法;加BindingFlags可控制可见性(如BindingFlags.NonPublic | BindingFlags.Instance查私有实例方法) -
type.GetProperties()、type.GetFields()、type.GetConstructors()同理 - 常用组合:
BindingFlags.Public | BindingFlags.Instance查公有实例成员;BindingFlags.Static | BindingFlags.FlattenHierarchy查静态继承成员 - 建议配合 LINQ 筛选,例如
type.GetMethods().Where(m => m.Name.StartsWith("Get"))
动态创建对象并调用成员
反射不仅看,还能做:
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~