- 优化DynamicEntity设置动态对象的属性值逻辑

This commit is contained in:
d4ilys 2023-05-05 11:44:12 +08:00
parent fa20468dc8
commit 18cd0e7a28
3 changed files with 30 additions and 14 deletions

View File

@ -1,15 +1,13 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Reflection; using System.Reflection;
using System.Reflection.Emit; using System.Reflection.Emit;
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
namespace FreeSql namespace FreeSql.Extensions.DynamicEntity
{ {
/// <summary> /// <summary>
/// 动态创建实体类型 /// 动态创建实体类型
@ -57,7 +55,7 @@ namespace FreeSql
/// </summary> /// </summary>
/// <param name="superClass">父类类型</param> /// <param name="superClass">父类类型</param>
/// <returns></returns> /// <returns></returns>
public DynamicCompileBuilder SuperClass(Type superClass) public DynamicCompileBuilder Extend(Type superClass)
{ {
_superClass = superClass; _superClass = superClass;
return this; return this;

View File

@ -1,7 +1,10 @@
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Security.Cryptography;
using System.Text;
namespace FreeSql.Extensions.DynamicEntity namespace FreeSql.Extensions.DynamicEntity
{ {
@ -22,8 +25,8 @@ namespace FreeSql.Extensions.DynamicEntity
/// <summary> /// <summary>
/// 委托缓存 /// 委托缓存
/// </summary> /// </summary>
private static readonly ConcurrentDictionary<string, Delegate> private static readonly ConcurrentDictionary<string, Delegate> DelegateCache =
DelegateCache = new ConcurrentDictionary<string, Delegate>(); new ConcurrentDictionary<string, Delegate>();
/// <summary> /// <summary>
/// 设置动态对象的属性值 /// 设置动态对象的属性值
@ -39,7 +42,9 @@ namespace FreeSql.Extensions.DynamicEntity
if (istance == null) if (istance == null)
return null; return null;
//根据key确定缓存 //根据key确定缓存
var cacheKey = $"{type.GetHashCode()}{porpertys.GetHashCode()}"; var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s));
var dicKey = Md5Encryption(cacheKeyStr);
var cacheKey = $"{type.GetHashCode()}-{dicKey}";
var dynamicDelegate = DelegateCache.GetOrAdd(cacheKey, key => var dynamicDelegate = DelegateCache.GetOrAdd(cacheKey, key =>
{ {
//表达式目录树构建委托 //表达式目录树构建委托
@ -70,5 +75,18 @@ namespace FreeSql.Extensions.DynamicEntity
var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys); var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys);
return dynamicInvoke; return dynamicInvoke;
} }
private static string Md5Encryption(string inputStr)
{
var result = string.Empty;
//32位大写
using (var md5 = MD5.Create())
{
var resultBytes = md5.ComputeHash(Encoding.UTF8.GetBytes(inputStr));
result = BitConverter.ToString(resultBytes);
}
return result;
}
} }
} }

View File

@ -4,12 +4,12 @@
<name>FreeSql.Extensions.DynamicEntity</name> <name>FreeSql.Extensions.DynamicEntity</name>
</assembly> </assembly>
<members> <members>
<member name="T:FreeSql.DynamicCompileBuilder"> <member name="T:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder">
<summary> <summary>
动态创建实体类型 动态创建实体类型
</summary> </summary>
</member> </member>
<member name="M:FreeSql.DynamicCompileBuilder.Class(System.String,System.Attribute[])"> <member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Class(System.String,System.Attribute[])">
<summary> <summary>
配置Class 配置Class
</summary> </summary>
@ -17,7 +17,7 @@
<param name="attributes">类标记的特性[Table(Name = "xxx")] [Index(xxxx)]</param> <param name="attributes">类标记的特性[Table(Name = "xxx")] [Index(xxxx)]</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.DynamicCompileBuilder.Property(System.String,System.Type,System.Attribute[])"> <member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Property(System.String,System.Type,System.Attribute[])">
<summary> <summary>
配置属性 配置属性
</summary> </summary>
@ -26,27 +26,27 @@
<param name="attributes">属性标记的特性-支持多个</param> <param name="attributes">属性标记的特性-支持多个</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.DynamicCompileBuilder.SuperClass(System.Type)"> <member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Extend(System.Type)">
<summary> <summary>
配置父类 配置父类
</summary> </summary>
<param name="superClass">父类类型</param> <param name="superClass">父类类型</param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.DynamicCompileBuilder.Build"> <member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.Build">
<summary> <summary>
Emit动态创建出Class - Type Emit动态创建出Class - Type
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.DynamicCompileBuilder.FirstCharToLower(System.String)"> <member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.FirstCharToLower(System.String)">
<summary> <summary>
首字母小写 首字母小写
</summary> </summary>
<param name="input"></param> <param name="input"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSql.DynamicCompileBuilder.FirstCharToUpper(System.String)"> <member name="M:FreeSql.Extensions.DynamicEntity.DynamicCompileBuilder.FirstCharToUpper(System.String)">
<summary> <summary>
首字母大写 首字母大写
</summary> </summary>