焦作网站建设公司哪家好wordpress最大上传2m
焦作网站建设公司哪家好,wordpress最大上传2m,苏州做网站比较好的公司,wordpress 设置导航C# 中的反射#xff08;Reflection#xff09; 是 .NET 提供的一种强大机制#xff0c;允许程序在运行时检查、分析和操作类型#xff08;类、结构、接口、方法、属性等#xff09;的元数据#xff0c;并动态创建对象、调用方法、访问字段或属性。它主要通过 System.Refl…C# 中的反射Reflection是 .NET 提供的一种强大机制允许程序在运行时检查、分析和操作类型类、结构、接口、方法、属性等的元数据并动态创建对象、调用方法、访问字段或属性。它主要通过System.Reflection命名空间中的类实现。一、反射的核心用途动态加载程序集Assembly获取类型信息Type创建对象实例Activator / ConstructorInfo调用方法MethodInfo.Invoke读写属性或字段PropertyInfo / FieldInfo检查特性Attribute实现插件系统、ORM、序列化框架等二、基础使用步骤1. 获取 Type 对象// 方法1通过 typeofTypetype1typeof(string);// 方法2通过对象的 GetType()stringstrhello;Typetype2str.GetType();// 方法3通过类型全名从 Assembly 加载Typetype3Type.GetType(System.String);// 方法4从程序集加载AssemblyassemblyAssembly.LoadFrom(MyLibrary.dll);Typetype4assembly.GetType(MyNamespace.MyClass);注意Type.GetType(...)只能加载当前应用域中已加载或 mscorlib/System 中的类型跨程序集需指定完整名称含 Assembly 信息。2. 创建对象实例使用Activator.CreateInstanceTypetypetypeof(Person);objectobjActivator.CreateInstance(type);// 调用无参构造函数// 带参数构造objectobj2Activator.CreateInstance(type,Alice,30);使用ConstructorInfoConstructorInfoctortype.GetConstructor(newType[]{typeof(string),typeof(int)});objectinstancector.Invoke(newobject[]{Bob,25});3. 调用方法Typetypetypeof(Calculator);objectcalcActivator.CreateInstance(type);// 获取方法MethodInfomethodtype.GetMethod(Add);// 调用实例方法intresult(int)method.Invoke(calc,newobject[]{10,20});// 调用静态方法MethodInfostaticMethodtype.GetMethod(Multiply);intstaticResult(int)staticMethod.Invoke(null,newobject[]{5,6});如果方法是泛型需先调用MakeGenericMethod()。4. 访问属性PropertyTypetypetypeof(Person);objectpersonActivator.CreateInstance(type);// 设置属性PropertyInfonameProptype.GetProperty(Name);nameProp.SetValue(person,Charlie);// 获取属性值stringname(string)nameProp.GetValue(person);5. 访问字段FieldFieldInfofieldtype.GetField(_age,BindingFlags.NonPublic|BindingFlags.Instance);field.SetValue(person,28);intage(int)field.GetValue(person);注意私有成员需要BindingFlags.NonPublic。6. 获取所有成员Typetypetypeof(MyClass);// 所有公共方法MethodInfo[]methodstype.GetMethods();// 所有公共属性PropertyInfo[]propstype.GetProperties();// 所有字段包括私有FieldInfo[]fieldstype.GetFields(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance);// 所有构造函数ConstructorInfo[]ctorstype.GetConstructors();7. 检查和读取特性Attribute[DisplayName(用户实体)]publicclassUser{}// 检查是否有某个 AttributeboolhasAttrtype.IsDefined(typeof(DisplayNameAttribute),false);// 获取 Attribute 实例varattr(DisplayNameAttribute)type.GetCustomAttribute(typeof(DisplayNameAttribute));Console.WriteLine(attr.DisplayName);// 输出用户实体三、常用 BindingFlags 枚举值标志说明Public公共成员默认NonPublic私有/受保护成员Instance实例成员Static静态成员DeclaredOnly仅当前类型声明的成员不包括继承示例type.GetMethod(PrivateMethod,BindingFlags.NonPublic|BindingFlags.Instance);四、性能注意事项反射比直接调用慢很多可能慢 10~100 倍因为涉及类型查找、安全检查、装箱/拆箱等。避免在高频循环中使用反射。可缓存 MethodInfo / PropertyInfo 等以提升性能。考虑使用委托如Delegate.CreateDelegate或表达式树Expression优化。.NET Core / .NET 5 引入了System.Reflection.Emit和source generator等更高效替代方案。五、实际应用场景举例1. 通用对象拷贝器publicstaticvoidCopyProperties(objectsource,objecttarget){varsourceTypesource.GetType();vartargetTypetarget.GetType();foreach(varpropinsourceType.GetProperties()){vartargetProptargetType.GetProperty(prop.Name);if(targetProp!nulltargetProp.CanWrite){targetProp.SetValue(target,prop.GetValue(source));}}}2. 插件系统AssemblypluginAssembly.LoadFrom(Plugin.dll);TypepluginTypeplugin.GetTypes().FirstOrDefault(ttypeof(IPlugin).IsAssignableFrom(t));IPlugininstance(IPlugin)Activator.CreateInstance(pluginType);instance.Execute();3. ORM 映射如将 DataTable 转为对象publicstaticTToObjectT(DataRowrow)whereT:new(){TobjnewT();Typetypetypeof(T);foreach(DataColumncolinrow.Table.Columns){PropertyInfoproptype.GetProperty(col.ColumnName);if(prop!nullrow[col]!DBNull.Value)prop.SetValue(obj,row[col]);}returnobj;}六、总结优点缺点高度灵活支持运行时动态行为性能开销大实现通用框架如 DI、AOP、序列化代码可读性降低支持插件、脚本扩展容易引发运行时异常如拼写错误可用于调试、测试工具不支持 AOT 编译如 Native AOT的部分场景✅建议仅在必要时使用反射并做好异常处理如NullReferenceException、TargetException、MissingMethodException等。