DynamicClassHelper.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System.Reflection;
  2. using System.Reflection.Emit;
  3. using Hotline.Share.Dtos;
  4. using Hotline.Share.Dtos.Order;
  5. using MiniExcelLibs.Attributes;
  6. using XF.Domain.Extensions;
  7. namespace Hotline.Tools;
  8. public class DynamicClassHelper
  9. {
  10. public static Type CreateDynamicClass(List<ColumnInfo> propInfos)
  11. {
  12. string className = "DynamicClass";
  13. AssemblyName assemblyName = new AssemblyName("DynamicAssembly");
  14. AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
  15. ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
  16. TypeBuilder typeBuilder = moduleBuilder.DefineType(className, TypeAttributes.Public);
  17. foreach (var property in propInfos)
  18. {
  19. var propertyName = property.Prop.Trim().ToPascalCase();
  20. var propertyType = typeof(string);
  21. FieldBuilder fieldBuilder = typeBuilder.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
  22. PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
  23. MethodAttributes getSetAttributes = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
  24. MethodBuilder getMethodBuilder = typeBuilder.DefineMethod("get_" + propertyName, getSetAttributes, propertyType, Type.EmptyTypes);
  25. ILGenerator getIL = getMethodBuilder.GetILGenerator();
  26. getIL.Emit(OpCodes.Ldarg_0);
  27. getIL.Emit(OpCodes.Ldfld, fieldBuilder);
  28. getIL.Emit(OpCodes.Ret);
  29. MethodBuilder setMethodBuilder = typeBuilder.DefineMethod("set_" + propertyName, getSetAttributes, null, new Type[] { propertyType });
  30. ILGenerator setIL = setMethodBuilder.GetILGenerator();
  31. setIL.Emit(OpCodes.Ldarg_0);
  32. setIL.Emit(OpCodes.Ldarg_1);
  33. setIL.Emit(OpCodes.Stfld, fieldBuilder);
  34. setIL.Emit(OpCodes.Ret);
  35. propertyBuilder.SetGetMethod(getMethodBuilder);
  36. propertyBuilder.SetSetMethod(setMethodBuilder);
  37. var columnNameCtorInfo = typeof(ExcelColumnNameAttribute).GetConstructor(new Type[] { typeof(string), typeof(string[]) });
  38. var attributeBuilder = new CustomAttributeBuilder(columnNameCtorInfo, new object[] { property.Name, null });
  39. propertyBuilder.SetCustomAttribute(attributeBuilder);
  40. }
  41. Type generatedType = typeBuilder.CreateType();
  42. return generatedType;
  43. }
  44. }