68 lines
2.9 KiB
C#
68 lines
2.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection.Emit;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace SqlSugar
|
|
{
|
|
internal class EmitTool
|
|
{
|
|
internal static ModuleBuilder CreateModuleBuilder()
|
|
{
|
|
AssemblyBuilder assemblyBuilder = CreateAssembly();
|
|
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicModule");
|
|
return moduleBuilder;
|
|
}
|
|
|
|
internal static AssemblyBuilder CreateAssembly()
|
|
{
|
|
AssemblyName assemblyName = new AssemblyName($"DynamicAssembly_{Guid.NewGuid():N}");
|
|
AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndCollect);
|
|
return assemblyBuilder;
|
|
}
|
|
|
|
internal static TypeBuilder CreateTypeBuilder(string className, TypeAttributes attributes, Type baseType, Type[] interfaces)
|
|
{
|
|
ModuleBuilder moduleBuilder = EmitTool.CreateModuleBuilder();
|
|
TypeBuilder typeBuilder = moduleBuilder.DefineType(className, attributes, baseType, interfaces);
|
|
return typeBuilder;
|
|
}
|
|
internal static PropertyBuilder CreateProperty(TypeBuilder typeBuilder, string propertyName, Type propertyType, IEnumerable<CustomAttributeBuilder> propertyCustomAttributes = null)
|
|
{
|
|
FieldBuilder fieldBuilder = typeBuilder.DefineField($"_{propertyName}", propertyType, FieldAttributes.Private);
|
|
|
|
PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.None, propertyType, null);
|
|
|
|
MethodBuilder getterBuilder = typeBuilder.DefineMethod($"get_{propertyName}", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, propertyType, Type.EmptyTypes);
|
|
ILGenerator getterIL = getterBuilder.GetILGenerator();
|
|
getterIL.Emit(OpCodes.Ldarg_0);
|
|
getterIL.Emit(OpCodes.Ldfld, fieldBuilder);
|
|
getterIL.Emit(OpCodes.Ret);
|
|
|
|
MethodBuilder setterBuilder = typeBuilder.DefineMethod($"set_{propertyName}", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new[] { propertyType });
|
|
ILGenerator setterIL = setterBuilder.GetILGenerator();
|
|
setterIL.Emit(OpCodes.Ldarg_0);
|
|
setterIL.Emit(OpCodes.Ldarg_1);
|
|
setterIL.Emit(OpCodes.Stfld, fieldBuilder);
|
|
setterIL.Emit(OpCodes.Ret);
|
|
|
|
propertyBuilder.SetGetMethod(getterBuilder);
|
|
propertyBuilder.SetSetMethod(setterBuilder);
|
|
|
|
if (propertyCustomAttributes != null)
|
|
{
|
|
foreach (var attributeBuilder in propertyCustomAttributes)
|
|
{
|
|
propertyBuilder.SetCustomAttribute(attributeBuilder);
|
|
}
|
|
}
|
|
|
|
return propertyBuilder;
|
|
}
|
|
|
|
}
|
|
}
|