¶Ô±ÈÐÂÎļþ |
| | |
| | | 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>(); |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | } |