mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
调整动态赋值逻辑
This commit is contained in:
parent
c012c166d8
commit
1753a51b42
@ -7,11 +7,13 @@ 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
|
||||
{
|
||||
@ -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<string, Delegate>
|
||||
_delegateCache = new ConcurrentDictionary<string, Delegate>();
|
||||
|
||||
//设置动态对象的属性值
|
||||
//设置动态对象的属性值 使用FreeSql自带功能
|
||||
public static object CreateObjectByTypeByCodeFirst(IFreeSql fsql, Type type,
|
||||
Dictionary<string, object> 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<string, object> 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,6 +246,19 @@ 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
|
||||
@ -233,4 +268,3 @@ namespace FreeSql.Internal
|
||||
public Attribute[] Attributes { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user