diff --git a/FreeSql/Internal/DynamicCompileBuilder.cs b/FreeSql/Internal/DynamicCompileBuilder.cs
index 4c93cdac..c857eb74 100644
--- a/FreeSql/Internal/DynamicCompileBuilder.cs
+++ b/FreeSql/Internal/DynamicCompileBuilder.cs
@@ -7,13 +7,15 @@ using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
+using System.Security.Cryptography;
+using FreeSql.Internal.Model;
+using System.Text;
namespace FreeSql.Internal
{
#if net40 || NETSTANDARD2_0
-
#else
- public class DynamicCompileBuilder
+ public class DynamicCompileBuilder
{
private string _className = string.Empty;
private TableAttribute _tableAttribute = null;
@@ -39,12 +41,12 @@ namespace FreeSql.Internal
/// 属性类型
/// 属性标记的特性-支持多个
///
- public DynamicCompileBuilder Property(string propertyName, Type propertyType, params Attribute [] attributes)
+ public DynamicCompileBuilder Property(string propertyName, Type propertyType, params Attribute[] attributes)
{
_properties.Add(new DynamicPropertyInfo()
{
PropertyName = propertyName,
- PropertyType = propertyType,
+ PropertyType = propertyType,
Attributes = attributes
});
return this;
@@ -140,7 +142,8 @@ namespace FreeSql.Internal
//设置程序集的名称
var defineDynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
//动态在程序集内创建一个模块
- var defineDynamicModule = defineDynamicAssembly.DefineDynamicModule("FreeSql.DynamicCompileBuilder.Dynamics");
+ var defineDynamicModule =
+ defineDynamicAssembly.DefineDynamicModule("FreeSql.DynamicCompileBuilder.Dynamics");
//动态的在模块内创建一个类
var typeBuilder = defineDynamicModule.DefineType(_className, TypeAttributes.Public | TypeAttributes.Class);
@@ -158,7 +161,25 @@ namespace FreeSql.Internal
private static ConcurrentDictionary
_delegateCache = new ConcurrentDictionary();
- //设置动态对象的属性值
+ //设置动态对象的属性值 使用FreeSql自带功能
+ public static object CreateObjectByTypeByCodeFirst(IFreeSql fsql, Type type,
+ Dictionary porpertys)
+ {
+ if (type == null)
+ return null;
+ object istance = Activator.CreateInstance(type);
+ if (istance == null)
+ return null;
+ var table = fsql.CodeFirst.GetTableByEntity(type);
+ foreach (var kv in porpertys)
+ {
+ table.ColumnsByCs[kv.Key].SetValue(istance, kv.Value);
+ }
+
+ return istance;
+ }
+
+ //设置动态对象的属性值,使用表达式目录树
public static object CreateObjectByType(Type type, Dictionary porpertys)
{
if (type == null)
@@ -167,7 +188,8 @@ namespace FreeSql.Internal
if (istance == null)
return null;
//根据字典中的key确定缓存
- var cacheKey = string.Join("-", porpertys.Keys.OrderBy(s => s));
+ var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s));
+ var cacheKey = Md5Encryption(cacheKeyStr);
var dynamicDelegate = _delegateCache.GetOrAdd(cacheKey, key =>
{
//表达式目录树构建委托
@@ -224,13 +246,25 @@ namespace FreeSql.Internal
string str = input.First().ToString().ToUpper() + input.Substring(1);
return str;
}
+
+ 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;
+ }
}
#endif
internal class DynamicPropertyInfo
{
public string PropertyName { get; set; } = string.Empty;
public Type PropertyType { get; set; }
- public Attribute [] Attributes { get; set; }
+ public Attribute[] Attributes { get; set; }
}
-}
-
+}
\ No newline at end of file