Merge pull request #1740 from vsuyi/master

DynamicEntity.DynamicCompileBuilder增加TypeBuilder只读属性和仅构建类型的方法
This commit is contained in:
2881099 2024-03-05 07:56:16 +08:00 committed by GitHub
commit 6c10057459
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -87,6 +87,7 @@ namespace FreeSql.Extensions.DynamicEntity
private List<DynamicPropertyInfo> _properties = new List<DynamicPropertyInfo>();
private Type _superClass = null;
private IFreeSql _fsql = null;
private TypeBuilder _typeBuilder = null;
/// <summary>
/// 配置Class
@ -99,8 +100,25 @@ namespace FreeSql.Extensions.DynamicEntity
_fsql = fsql;
_className = className;
_tableAttributes = attributes;
//初始化AssemblyName的一个实例
var assemblyName = new AssemblyName("FreeSql.DynamicCompileBuilder");
//设置程序集的名称
var defineDynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
//动态在程序集内创建一个模块
var defineDynamicModule =
defineDynamicAssembly.DefineDynamicModule("FreeSql.DynamicCompileBuilder.Dynamics");
//动态的在模块内创建一个类
_typeBuilder =
defineDynamicModule.DefineType(_className, TypeAttributes.Public | TypeAttributes.Class, _superClass);
}
/// <summary>
/// 获取类型构建器可作为要构建的Type来引用
/// </summary>
public TypeBuilder TypeBuilder { get { return _typeBuilder; } }
/// <summary>
/// 配置属性
/// </summary>
@ -388,27 +406,23 @@ namespace FreeSql.Extensions.DynamicEntity
/// <returns></returns>
public TableInfo Build()
{
//初始化AssemblyName的一个实例
var assemblyName = new AssemblyName("FreeSql.DynamicCompileBuilder");
//设置程序集的名称
var defineDynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
//动态在程序集内创建一个模块
var defineDynamicModule =
defineDynamicAssembly.DefineDynamicModule("FreeSql.DynamicCompileBuilder.Dynamics");
//动态的在模块内创建一个类
var typeBuilder =
defineDynamicModule.DefineType(_className, TypeAttributes.Public | TypeAttributes.Class, _superClass);
return _fsql.CodeFirst.GetTableByEntity(BuildJustType());
}
/// <summary>
/// Emit动态创建出Class - Type不附带获取TableInfo
/// </summary>
/// <returns></returns>
public Type BuildJustType()
{
//设置TableAttribute
SetTableAttribute(ref typeBuilder);
SetTableAttribute(ref _typeBuilder);
//设置属性
SetPropertys(ref typeBuilder);
SetPropertys(ref _typeBuilder);
//创建类的Type对象
var type = typeBuilder.CreateTypeInfo().AsType();
return _fsql.CodeFirst.GetTableByEntity(type);
return _typeBuilder.CreateTypeInfo().AsType();
}
/// <summary>