|
@@ -17,7 +17,7 @@ public class DynamicClassHelper
|
|
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
|
|
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
|
|
TypeBuilder typeBuilder = moduleBuilder.DefineType(className, TypeAttributes.Public);
|
|
TypeBuilder typeBuilder = moduleBuilder.DefineType(className, TypeAttributes.Public);
|
|
|
|
|
|
- foreach (var property in propInfos)
|
|
|
|
|
|
+ foreach (var property in propInfos.OrderBy(d=>d.Sort).ToList())
|
|
{
|
|
{
|
|
var propertyName = property.Prop.Trim().ToPascalCase();
|
|
var propertyName = property.Prop.Trim().ToPascalCase();
|
|
var propertyType = typeof(string);
|
|
var propertyType = typeof(string);
|
|
@@ -51,4 +51,55 @@ public class DynamicClassHelper
|
|
Type generatedType = typeBuilder.CreateType();
|
|
Type generatedType = typeBuilder.CreateType();
|
|
return generatedType;
|
|
return generatedType;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ public static Type CreateDynamicClass<TSource>(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);
|
|
|
|
+ var sourceProps = typeof(TSource).GetProperties();
|
|
|
|
+
|
|
|
|
+ foreach (var property in propInfos.OrderBy(d => d.Sort).ToList())
|
|
|
|
+ {
|
|
|
|
+ var propertyName = property.Prop.Trim().ToPascalCase();
|
|
|
|
+ var propertyType = sourceProps.FirstOrDefault(d => d.Name == propertyName)?.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);
|
|
|
|
+
|
|
|
|
+ if (propertyType == typeof(DateTime))
|
|
|
|
+ {
|
|
|
|
+ var columnExcelFormatCtorInfo = typeof(ExcelFormatAttribute).GetConstructor(new Type[] { typeof(string) });
|
|
|
|
+ var excelFormatAttributeBuilder = new CustomAttributeBuilder(columnExcelFormatCtorInfo, new object[] { "yyyy-MM-dd HH:mm:ss" });
|
|
|
|
+ propertyBuilder.SetCustomAttribute(excelFormatAttributeBuilder);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ Type generatedType = typeBuilder.CreateType();
|
|
|
|
+ return generatedType;
|
|
|
|
+ }
|
|
}
|
|
}
|