123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Reflection.Emit;
- using System.Reflection;
- using System.Text;
- using System.Threading.Tasks;
- using System.Runtime.InteropServices;
- namespace SqlSugar
- {
- public class DynamicProperyBuilder
- {
- private bool IsCache = false;
- public static DynamicProperyBuilder CopyNew()
- {
- return new DynamicProperyBuilder();
- }
- public DynamicBuilder baseBuilder;
- public DynamicProperyBuilder CreateProperty(string propertyName, Type properyType, SugarColumn column=null,bool isSplitField=false, Navigate navigate=null)
- {
- if (column == null)
- {
- column = new SugarColumn()
- {
- ColumnName=propertyName
- };
- }
- PropertyMetadata addItem = new PropertyMetadata();
- addItem.Name = propertyName;
- addItem.Type = properyType;
- addItem.CustomAttributes = new List<CustomAttributeBuilder>() { baseBuilder.GetProperty(column) };
- if (navigate != null)
- {
- addItem.CustomAttributes.Add(BuildNavigateAttribute(navigate));
- }
- baseBuilder.propertyAttr.Add(addItem);
- if (isSplitField)
- {
- addItem.CustomAttributes.Add(baseBuilder.GetSplitFieldAttr(new SplitFieldAttribute()));
- }
- return this;
- }
- public DynamicProperyBuilder WithCache(bool isCache=true)
- {
- IsCache = isCache;
- return this;
- }
- public Type BuilderType()
- {
- if (IsCache)
- {
- var key = baseBuilder.entityName + string.Join("_", baseBuilder.propertyAttr.Select(it => it.Name + it.Type.Name));
- return new ReflectionInoCacheService().GetOrCreate(key,() =>
- {
- var result = DynamicBuilderHelper.CreateDynamicClass(baseBuilder.entityName, baseBuilder.propertyAttr, TypeAttributes.Public, baseBuilder.entityAttr, baseBuilder.baseType, baseBuilder.interfaces);
- return result;
- });
- }
- else
- {
- var result = DynamicBuilderHelper.CreateDynamicClass(baseBuilder.entityName, baseBuilder.propertyAttr, TypeAttributes.Public, baseBuilder.entityAttr, baseBuilder.baseType, baseBuilder.interfaces);
- return result;
- }
- }
- public CustomAttributeBuilder BuildNavigateAttribute(Navigate navigate)
- {
- NavigateType navigatType = navigate.NavigatType;
- string name = navigate.Name;
- string name2 = navigate.Name2;
- string whereSql = navigate.WhereSql;
- Type mappingTableType = navigate.MappingType;
- string typeAiD = navigate.MappingAId;
- string typeBId = navigate.MappingBId;
- ConstructorInfo constructor;
- object[] constructorArgs;
- if (mappingTableType != null && typeAiD != null && typeBId != null)
- {
- constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(Type), typeof(string), typeof(string), typeof(string) });
- constructorArgs = new object[] { mappingTableType, typeAiD, typeBId, whereSql };
- }
- else if (!string.IsNullOrEmpty(whereSql))
- {
- constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(NavigateType), typeof(string), typeof(string), typeof(string) });
- constructorArgs = new object[] { navigatType, name, name2, whereSql };
- }
- else if (!string.IsNullOrEmpty(name2))
- {
- constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(NavigateType), typeof(string), typeof(string) });
- constructorArgs = new object[] { navigatType, name, name2 };
- }
- else
- {
- constructor = typeof(Navigate).GetConstructor(new Type[] { typeof(NavigateType), typeof(string) });
- constructorArgs = new object[] { navigatType, name };
- }
- return new CustomAttributeBuilder(constructor, constructorArgs);
- }
- }
- }
|