动态操作表结构相关的API

This commit is contained in:
d4ilys 2023-04-25 10:29:08 +08:00
parent 8bd85ebe22
commit 5046907e4f

View File

@ -179,47 +179,47 @@ namespace FreeSql.Internal
return istance; return istance;
} }
//设置动态对象的属性值,使用表达式目录树 ////设置动态对象的属性值,使用表达式目录树
public static object CreateObjectByType(Type type, Dictionary<string, object> porpertys) //public static object CreateObjectByType(Type type, Dictionary<string, object> porpertys)
{ //{
if (type == null) // if (type == null)
return null; // return null;
object istance = Activator.CreateInstance(type); // object istance = Activator.CreateInstance(type);
if (istance == null) // if (istance == null)
return null; // return null;
//根据字典中的key确定缓存 // //根据字典中的key确定缓存
var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s)); // var cacheKeyStr = string.Join("-", porpertys.Keys.OrderBy(s => s));
var cacheKey = Md5Encryption(cacheKeyStr); // var cacheKey = Md5Encryption(cacheKeyStr);
var dynamicDelegate = _delegateCache.GetOrAdd(cacheKey, key => // var dynamicDelegate = _delegateCache.GetOrAdd(cacheKey, key =>
{ // {
//表达式目录树构建委托 // //表达式目录树构建委托
var typeParam = Expression.Parameter(type); // var typeParam = Expression.Parameter(type);
var dicParamType = typeof(Dictionary<string, object>); // var dicParamType = typeof(Dictionary<string, object>);
var dicParam = Expression.Parameter(dicParamType); // var dicParam = Expression.Parameter(dicParamType);
var exps = new List<Expression>(); // var exps = new List<Expression>();
var tempRef = Expression.Variable(typeof(object)); // var tempRef = Expression.Variable(typeof(object));
foreach (var pinfo in porpertys) // foreach (var pinfo in porpertys)
{ // {
var propertyInfo = type.GetProperty(pinfo.Key); // var propertyInfo = type.GetProperty(pinfo.Key);
if (propertyInfo == null) // if (propertyInfo == null)
continue; // continue;
var propertyName = Expression.Constant(pinfo.Key, typeof(string)); // var propertyName = Expression.Constant(pinfo.Key, typeof(string));
exps.Add(Expression.Call(dicParam, dicParamType.GetMethod("TryGetValue"), propertyName, tempRef)); // exps.Add(Expression.Call(dicParam, dicParamType.GetMethod("TryGetValue"), propertyName, tempRef));
exps.Add(Expression.Assign(Expression.MakeMemberAccess(typeParam, propertyInfo), // exps.Add(Expression.Assign(Expression.MakeMemberAccess(typeParam, propertyInfo),
Expression.Convert(tempRef, propertyInfo.PropertyType))); // Expression.Convert(tempRef, propertyInfo.PropertyType)));
exps.Add(Expression.Assign(tempRef, Expression.Default(typeof(object)))); // exps.Add(Expression.Assign(tempRef, Expression.Default(typeof(object))));
} // }
var returnTarget = Expression.Label(type); // var returnTarget = Expression.Label(type);
exps.Add(Expression.Return(returnTarget, typeParam)); // exps.Add(Expression.Return(returnTarget, typeParam));
exps.Add(Expression.Label(returnTarget, Expression.Default(type))); // exps.Add(Expression.Label(returnTarget, Expression.Default(type)));
var block = Expression.Block(new[] { tempRef }, exps); // var block = Expression.Block(new[] { tempRef }, exps);
var @delegate = Expression.Lambda(block, typeParam, dicParam).Compile(); // var @delegate = Expression.Lambda(block, typeParam, dicParam).Compile();
return @delegate; // return @delegate;
}); // });
var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys); // var dynamicInvoke = dynamicDelegate.DynamicInvoke(istance, porpertys);
return dynamicInvoke; // return dynamicInvoke;
} //}
/// <summary> /// <summary>
/// 首字母小写 /// 首字母小写