123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- using System.Reflection;
- using System.Reflection.Emit;
- using Hotline.Share.Dtos;
- using Hotline.Share.Dtos.Order;
- using MiniExcelLibs.Attributes;
- using XF.Domain.Extensions;
- namespace Hotline.Tools;
- public class DynamicClassHelper
- {
- public static Type CreateDynamicClass(List<ColumnInfo> propInfos)
- {
- string className = "DynamicClass";
- AssemblyName assemblyName = new AssemblyName("DynamicAssembly");
- AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
- ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
- TypeBuilder typeBuilder = moduleBuilder.DefineType(className, TypeAttributes.Public);
- foreach (var property in propInfos)
- {
- var propertyName = property.Prop.Trim().ToPascalCase();
- var propertyType = typeof(string);
- FieldBuilder fieldBuilder = typeBuilder.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
- PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);
- 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);
- var columnNameCtorInfo = typeof(ExcelColumnNameAttribute).GetConstructor(new Type[] { typeof(string), typeof(string[]) });
- var attributeBuilder = new CustomAttributeBuilder(columnNameCtorInfo, new object[] { property.Name, null });
- propertyBuilder.SetCustomAttribute(attributeBuilder);
- }
- Type generatedType = typeBuilder.CreateType();
- return generatedType;
- }
- }
|