mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
动态操作表结构相关的API
This commit is contained in:
parent
8bd85ebe22
commit
5046907e4f
@ -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>
|
||||||
/// 首字母小写
|
/// 首字母小写
|
||||||
|
Loading…
x
Reference in New Issue
Block a user