Create TypeA and TypeB with B in A and A in B

This commit is contained in:
sunkaixuan
2024-05-23 22:55:21 +08:00
parent ccabf258c2
commit baacb792ae
2 changed files with 64 additions and 0 deletions

View File

@@ -40,5 +40,35 @@ 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 = typeBuilderChild;
}
else if (type == typeof(DynamicOneselfTypeList))
{
type = typeof(List<>).MakeGenericType(typeBuilderChild);
}
EmitTool.CreateProperty(typeBuilder, property.Name, type, property.CustomAttributes);
}
Type dynamicType = typeBuilder.CreateTypeInfo().AsType();
return dynamicType;
}
}
}

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,38 @@ namespace SqlSugar
return result;
}
}
#region BuilderTypes
public (Type a, Type b) 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, () =>
{
(Type, Type) result = GetBuilderTypes(dynamicBuilderB);
return result;
});
}
else
{
(Type, Type) result = GetBuilderTypes(dynamicBuilderB);
return result;
}
}
private (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);
var result = (typeBuilderA.CreateTypeInfo().AsType(), typeBuilderB.CreateTypeInfo().AsType());
return result;
}
#endregion
public CustomAttributeBuilder BuildNavigateAttribute(Navigate navigate)
{
NavigateType navigatType = navigate.NavigatType;