2026/4/17 0:40:32
网站建设
项目流程
昆明医院网站建设,wap网站 微信小程序,东莞网站建设方案推广,一个购物网站开发的可行性一、反射#xff08;Reflection#xff09;的清晰定义
反射#xff08;Reflection#xff09; 是 .NET 框架提供的核心运行时机制#xff0c;它允许程序在运行时而非编译时#xff1a;
获取程序集#xff08;Assembly#xff09;、模块#xff08;Module#xff09;、…一、反射Reflection的清晰定义反射Reflection是 .NET 框架提供的核心运行时机制它允许程序在运行时而非编译时获取程序集Assembly、模块Module、类型Type的元数据信息动态创建对象实例动态调用方法动态读取或修改属性/字段动态解析自定义特性Attribute对比理解方式特点普通编码编译期确定类型直接调用性能高反射编程运行期确定类型动态操作极度灵活通俗理解普通编程编译期就确定要使用哪个类、调用哪个方法代码是“写死的”。反射编程程序运行时才知道要操作哪个类通过读取元数据“动态操作类型”。一句话反射 运行时读取元数据 动态操作类型二、.NET 中反射的底层基础IL 与元数据C# → 编译 →IL中间语言同时生成Metadata元数据表包含类型名、命名空间、成员签名、特性信息等反射的本质读取程序集中的 Metadata而不是“反编译源码”三、反射核心类继承体系与关键成员1. 核心类继承结构MemberInfo ├── FieldInfo ├── PropertyInfo ├── MethodBase │ ├── ConstructorInfo │ └── MethodInfo └── EventInfoMemberInfo是所有“成员描述类”的抽象基类。2. 各核心类的关键成员常用类名核心父类关键成员作用说明MemberInfo-Name、GetCustomAttributes()获取成员名称、自定义特性MethodBaseMemberInfoIsAbstract、IsPublic、IsStatic、Invoke()判断方法特性、调用方法或构造函数ConstructorInfoMethodBaseInvoke(object[] parameters)调用构造函数创建实例MethodInfoMethodBaseReturnType、Invoke()获取返回值类型、调用方法PropertyInfoMemberInfoCanRead、CanWrite、PropertyType、GetValue()、SetValue()获取/设置属性值四、Type 类深度解析核心入口Type是整个反射体系的入口类几乎所有反射操作都从它开始。常用成员1. 类型判断IsInterface、IsArray、IsPrimitive、IsEnumIsClass、IsPublic2. 类型信息Name类型名、FullName完整类型名、BaseType基类3. 类型关系判断IsInstanceOfType(object obj)IsAssignableFrom(Type type)4. 成员获取GetConstructor(Type[] paramTypes)GetMethod(string name, Type[] paramTypes)GetProperty(string name)基础示例Typetypetypeof(Person);Console.WriteLine(type.Name);Console.WriteLine(type.FullName);Console.WriteLine(type.BaseType);Console.WriteLine(type.IsClass);Console.WriteLine(type.IsPublic);运行结果Person ReflectionDemo.Person System.Object True True五、核心反射类型详解附示例1. MemberInfoTypetypetypeof(Person);foreach(MemberInfomemberintype.GetMembers()){Console.WriteLine(member.Name - member.MemberType);}运行结果示例get_Name - Method set_Name - Method SayHi - Method Name - Property2. MethodInfo方法反射获取并调用无参方法MethodInfomethodtype.GetMethod(SayHi);method.Invoke(personObj,null);运行结果Hi, my name is chen调用带参数方法MethodInfomethod2type.GetMethod(SayHi,newType[]{typeof(string)});method2.Invoke(personObj,newobject[]{Tom});运行结果Hi, Tom3. ConstructorInfo构造函数反射ConstructorInfoctortype.GetConstructor(Type.EmptyTypes);objectobjctor.Invoke(null);等价于objectobjActivator.CreateInstance(type);4. PropertyInfo属性反射PropertyInfoproptype.GetProperty(Name);// 设置值prop.SetValue(obj,chen);// 获取值stringname(string)prop.GetValue(obj);输出chen六、完整反射综合示例usingSystem;usingSystem.Reflection;classProgram{staticvoidMain(){Typetypetypeof(Person);// 创建实例objectobjActivator.CreateInstance(type);// 设置属性PropertyInfoproptype.GetProperty(Name);prop.SetValue(obj,chen);// 调用无参方法MethodInfom1type.GetMethod(SayHi);m1.Invoke(obj,null);// 调用带参方法MethodInfom2type.GetMethod(SayHi,new[]{typeof(string)});m2.Invoke(obj,newobject[]{Jack});}}classPerson{publicstringName{get;set;}publicvoidSayHi(){Console.WriteLine($Hi, my name is{Name});}publicvoidSayHi(stringname){Console.WriteLine($Hi,{name});}}运行结果Hi, my name is chen Hi, Jack七、反射实现通用对象拷贝完整 验证1. 拷贝方法浅拷贝staticobjectMyClone(objectsource){if(sourcenull)thrownewArgumentNullException(nameof(source));Typetypesource.GetType();objecttargetActivator.CreateInstance(type);foreach(PropertyInfopropintype.GetProperties()){if(prop.CanReadprop.CanWrite){prop.SetValue(target,prop.GetValue(source));}}returntarget;}2. 验证代码Personp1newPerson{Namechen,Age12};Personp2(Person)MyClone(p1);p2.Namezhangsan;Console.WriteLine(p1.Name);Console.WriteLine(p2.Name);运行结果chen zhangsan特点说明✅ 支持任意对象、不依赖具体类型❌ 仅实现浅拷贝❌ 要求目标类型有无参构造函数八、反射的典型使用场景工程级1. 框架与底层组件ORMEF Core、Dapper依赖注入Autofac序列化Newtonsoft.Json、System.Text.Json2. 插件化架构动态加载 DLL运行时发现并执行模块3. 通用基础工具对象拷贝表单/模型验证通用 Mapper九、反射的代价、注意事项与优化方案1. 性能问题反射 ≈ 普通调用的5~20 倍开销优化方案缓存Type / MethodInfo / PropertyInfo等反射对象结合表达式树Expression优化使用Delegate.CreateDelegate转为委托调用2. 封装性破坏反射可绕过访问修饰符访问私有成员建议框架级场景使用业务层慎用3. 类型安全编译期无法校验反射操作的类型正确性必须做好异常处理如NullReferenceException、MissingMethodException等十、总结工程视角反射是 .NET 框架能力的地基是框架的灵魂核心入口Type类核心成员描述类MethodInfo / PropertyInfo / ConstructorInfo优点高度灵活、解耦框架开发必备缺点性能损耗、类型不安全、破坏封装性业务代码应“少而精”使用框架代码必须掌握反射不是为了偷懒而是为了“抽象与解耦”。