Synchronization code

This commit is contained in:
sunkaixuan
2024-05-23 23:47:05 +08:00
parent a8a9b5939f
commit ecde194ade
3 changed files with 82 additions and 0 deletions

View File

@@ -40,5 +40,43 @@ namespace SqlSugar
return dynamicType;
}
public static Type CreateDynamicClass(TypeBuilder typeBuilder,TypeBuilder typeBuilderChild,List<PropertyMetadata> properties, List<CustomAttributeBuilder> classCustomAttributes = null)
{
if (classCustomAttributes != null)
{
foreach (var attributeBuilder in classCustomAttributes)
{
typeBuilder.SetCustomAttribute(attributeBuilder);
}
}
foreach (PropertyMetadata property in properties)
{
var type = property.Type;
if (type == typeof(DynamicOneselfType))
{
type = typeBuilder;
}
else if (type == typeof(DynamicOneselfTypeList))
{
type = typeof(List<>).MakeGenericType(typeBuilder);
}
else if (type == typeof(NestedObjectType))
{
type = typeBuilderChild;
}
else if (type == typeof(NestedObjectTypeList))
{
type = typeof(List<>).MakeGenericType(typeBuilderChild);
}
EmitTool.CreateProperty(typeBuilder, property.Name, type, property.CustomAttributes);
}
Type dynamicType = typeBuilder.CreateTypeInfo().AsType();
return dynamicType;
}
}
}

View File

@@ -18,4 +18,15 @@ namespace SqlSugar
{
}
public class NestedObjectType
{
}
public class NestedObjectTypeList
{
}
}

View File

@@ -6,6 +6,8 @@ using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Security.AccessControl;
using System.Xml.Linq;
namespace SqlSugar
{
@@ -64,6 +66,37 @@ namespace SqlSugar
return result;
}
}
#region BuilderTypes
public Tuple<Type, Type> BuilderTypes(DynamicProperyBuilder dynamicBuilderB)
{
if (IsCache)
{
var key1 = baseBuilder.entityName + string.Join("_", baseBuilder.propertyAttr.Select(it => it.Name + it.Type.Name));
var key2 = dynamicBuilderB.baseBuilder.entityName + string.Join("_", dynamicBuilderB.baseBuilder.propertyAttr.Select(it => it.Name + it.Type.Name));
return new ReflectionInoCacheService().GetOrCreate(key1 + key2, () =>
{
Tuple<Type, Type> result = GetBuilderTypes(dynamicBuilderB);
return result;
});
}
else
{
Tuple<Type, Type> result = GetBuilderTypes(dynamicBuilderB);
return result;
}
}
private Tuple<Type,Type> GetBuilderTypes(DynamicProperyBuilder dynamicBuilderB)
{
DynamicProperyBuilder dynamicBuilderA = this;
TypeBuilder typeBuilderA = EmitTool.CreateTypeBuilder(dynamicBuilderA.baseBuilder.entityName, TypeAttributes.Public, dynamicBuilderA.baseBuilder.baseType, dynamicBuilderA.baseBuilder.interfaces);
TypeBuilder typeBuilderB = EmitTool.CreateTypeBuilder(dynamicBuilderB.baseBuilder.entityName, TypeAttributes.Public, dynamicBuilderB.baseBuilder.baseType, dynamicBuilderB.baseBuilder.interfaces);
DynamicBuilderHelper.CreateDynamicClass(typeBuilderA, typeBuilderB, dynamicBuilderA.baseBuilder.propertyAttr, dynamicBuilderA.baseBuilder.entityAttr);
DynamicBuilderHelper.CreateDynamicClass(typeBuilderB, typeBuilderA, dynamicBuilderB.baseBuilder.propertyAttr, dynamicBuilderB.baseBuilder.entityAttr);
return new Tuple<Type, Type>(typeBuilderB.CreateTypeInfo().AsType(), typeBuilderA.CreateTypeInfo().AsType());
}
#endregion
public CustomAttributeBuilder BuildNavigateAttribute(Navigate navigate)
{
NavigateType navigatType = navigate.NavigatType;