| using Magicodes.ExporterAndImporter.Core; | 
| using Magicodes.ExporterAndImporter.Excel; | 
| using Magicodes.IE.Core; | 
| using SqlSugar; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Reflection; | 
| using System.Reflection.Emit; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
|   | 
| namespace WIDESEA_Core.Helper | 
| { | 
|     public static class ExportHelper | 
|     { | 
|         public static Type CreateDynamicClass(this PropertyInfo[] propertyInfos) | 
|         { | 
|             string className = "DynamicClass"; | 
|             AssemblyName assemblyName = new AssemblyName("WIDESEA_Model.Models"); | 
|             AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);//定义具有指定名称和访问权限的动态程序集 | 
|             ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");//在此程序集中定义命名的暂时动态模块 | 
|             TypeBuilder typeBuilder = moduleBuilder.DefineType(className, TypeAttributes.Public);//TypeBuilder:在运行时定义并创建类的新实例 | 
|   | 
|             Type attributeType1 = typeof(ExcelExporterAttribute); | 
|             MethodInfo [] methodInfos = attributeType1.GetMethods(BindingFlags.Public); | 
|             ConstructorInfo[] constructorInfos2 = attributeType1.GetConstructors(); | 
|             ConstructorInfo constructorInfo2 = constructorInfos2[0]; | 
|             CustomAttributeBuilder customAttributeBuilder2 = new CustomAttributeBuilder(constructorInfo2, new object[] { }); | 
|   | 
|             typeBuilder.SetCustomAttribute(customAttributeBuilder2); | 
|   | 
|             foreach (var property in propertyInfos) | 
|             { | 
|                 string propertyName = property.Name; | 
|                 Type propertyType = property.PropertyType; | 
|   | 
|                 FieldBuilder fieldBuilder = typeBuilder.DefineField("_" + propertyName, propertyType, FieldAttributes.Private); | 
|                 PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null); | 
|   | 
|                 SugarColumn sugarColumn = property.GetCustomAttribute<SugarColumn>(); | 
|                 if (sugarColumn != null) | 
|                 { | 
|                     Type attributeType = typeof(ExporterHeaderAttribute); | 
|                     ConstructorInfo[] constructorInfos = attributeType.GetConstructors(); | 
|                     ConstructorInfo constructorInfo = constructorInfos[0]; | 
|                     CustomAttributeBuilder customAttributeBuilder = new CustomAttributeBuilder(constructorInfo, new object[] { sugarColumn.ColumnDescription, 11f, null, false, true, true, 0, KnownColor.Empty }); | 
|                     propertyBuilder.SetCustomAttribute(customAttributeBuilder); | 
|                 } | 
|   | 
|                 MethodAttributes getSetAttributes = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig; | 
|   | 
|                 MethodBuilder getMethodBuilder = typeBuilder.DefineMethod("get_" + propertyName, getSetAttributes, propertyType, Type.EmptyTypes); | 
|                 ILGenerator getIL = getMethodBuilder.GetILGenerator(); | 
|                 getIL.Emit(OpCodes.Ldarg_0); | 
|                 getIL.Emit(OpCodes.Ldfld, fieldBuilder); | 
|                 getIL.Emit(OpCodes.Ret); | 
|   | 
|                 MethodBuilder setMethodBuilder = typeBuilder.DefineMethod("set_" + propertyName, getSetAttributes, null, new Type[] { propertyType }); | 
|                 ILGenerator setIL = setMethodBuilder.GetILGenerator(); | 
|                 setIL.Emit(OpCodes.Ldarg_0); | 
|                 setIL.Emit(OpCodes.Ldarg_1); | 
|                 setIL.Emit(OpCodes.Stfld, fieldBuilder); | 
|                 setIL.Emit(OpCodes.Ret); | 
|   | 
|                 propertyBuilder.SetGetMethod(getMethodBuilder); | 
|                 propertyBuilder.SetSetMethod(setMethodBuilder); | 
|   | 
|   | 
|             } | 
|   | 
|             Type generatedType = typeBuilder.CreateType(); | 
|             return generatedType; | 
|         } | 
|   | 
|         public static void SetProperty(object instance, string propertyName, object value) | 
|         { | 
|             Type type = instance.GetType(); | 
|             PropertyInfo propertyInfo = type.GetProperty(propertyName); | 
|             propertyInfo.SetValue(instance, value); | 
|         } | 
|   | 
|         public static object GetProperty(object instance, string propertyName) | 
|         { | 
|             Type type = instance.GetType(); | 
|             PropertyInfo propertyInfo = type.GetProperty(propertyName); | 
|             return propertyInfo.GetValue(instance); | 
|         } | 
|   | 
|         public static void SetValue<T>(object instance, T value) | 
|         { | 
|             Type type = instance.GetType(); | 
|   | 
|             PropertyInfo[] propertyInfos = typeof(T).GetProperties(); | 
|             for (int j = 0; j < propertyInfos.Length; j++) | 
|             { | 
|                 PropertyInfo propertyInfo = type.GetProperty(propertyInfos[j].Name); | 
|                 object obj = propertyInfos[j].GetValue(value); | 
|                 propertyInfo.SetValue(instance, obj); | 
|                 ExporterHeaderAttribute exporterHeaderAttribute = propertyInfo.GetCustomAttribute<ExporterHeaderAttribute>(); | 
|             } | 
|   | 
|         } | 
|   | 
|     } | 
| } |