EmitTool.cs 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection.Emit;
  5. using System.Reflection;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace SqlSugar
  9. {
  10. internal class EmitTool
  11. {
  12. internal static ModuleBuilder CreateModuleBuilder()
  13. {
  14. AssemblyBuilder assemblyBuilder = CreateAssembly();
  15. ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicModule");
  16. return moduleBuilder;
  17. }
  18. internal static AssemblyBuilder CreateAssembly()
  19. {
  20. AssemblyName assemblyName = new AssemblyName($"DynamicAssembly_{Guid.NewGuid():N}");
  21. AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndCollect);
  22. return assemblyBuilder;
  23. }
  24. internal static TypeBuilder CreateTypeBuilder(string className, TypeAttributes attributes, Type baseType, Type[] interfaces)
  25. {
  26. ModuleBuilder moduleBuilder = EmitTool.CreateModuleBuilder();
  27. TypeBuilder typeBuilder = moduleBuilder.DefineType(className, attributes, baseType, interfaces);
  28. return typeBuilder;
  29. }
  30. internal static PropertyBuilder CreateProperty(TypeBuilder typeBuilder, string propertyName, Type propertyType, IEnumerable<CustomAttributeBuilder> propertyCustomAttributes = null)
  31. {
  32. FieldBuilder fieldBuilder = typeBuilder.DefineField($"_{propertyName}", propertyType, FieldAttributes.Private);
  33. PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.None, propertyType, null);
  34. MethodBuilder getterBuilder = typeBuilder.DefineMethod($"get_{propertyName}", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
  35. ILGenerator getterIL = getterBuilder.GetILGenerator();
  36. getterIL.Emit(OpCodes.Ldarg_0);
  37. getterIL.Emit(OpCodes.Ldfld, fieldBuilder);
  38. getterIL.Emit(OpCodes.Ret);
  39. MethodBuilder setterBuilder = typeBuilder.DefineMethod($"set_{propertyName}", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new[] { propertyType });
  40. ILGenerator setterIL = setterBuilder.GetILGenerator();
  41. setterIL.Emit(OpCodes.Ldarg_0);
  42. setterIL.Emit(OpCodes.Ldarg_1);
  43. setterIL.Emit(OpCodes.Stfld, fieldBuilder);
  44. setterIL.Emit(OpCodes.Ret);
  45. propertyBuilder.SetGetMethod(getterBuilder);
  46. propertyBuilder.SetSetMethod(setterBuilder);
  47. if (propertyCustomAttributes != null)
  48. {
  49. foreach (var attributeBuilder in propertyCustomAttributes)
  50. {
  51. propertyBuilder.SetCustomAttribute(attributeBuilder);
  52. }
  53. }
  54. return propertyBuilder;
  55. }
  56. }
  57. }