using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace Ant.Core.Utils
{
///
/// 高效实体转换(浅拷贝)(反射+表达式目录树+静态缓存 方式)
///
///
///
public static class SafeClone
{
private static readonly Func cache = GetFunc();
private static Func GetFunc()
{
ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
List memberBindingList = new List();
foreach (var item in typeof(TOut).GetProperties())
{
if (!item.CanWrite) continue;
var tInProperty = typeof(TIn).GetProperties().FirstOrDefault(x => x.Name == item.Name);
if (tInProperty != null && tInProperty.PropertyType == item.PropertyType)
{
MemberExpression property = Expression.Property(parameterExpression, tInProperty);
MemberBinding memberBinding = Expression.Bind(item, property);
memberBindingList.Add(memberBinding);
}
}
MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());
Expression> lambda = Expression.Lambda>(memberInitExpression, new ParameterExpression[] { parameterExpression });
return lambda.Compile();
}
public static TOut Trans(TIn tIn)
{
return cache(tIn);
}
}
}