using System;
using System.Collections.Generic;
using System.Linq.Expressions;
namespace Masuit.Tools.Core
{
///
/// 生成表达式目录树 泛型缓存
///
public static class ExpressionGenericMapper
{
private static object func;
///
/// 高性能对象浅克隆映射
///
///
///
///
///
public static TDestination Map(this TSource source)
{
if (func is null) //如果表达式不存在,则走一遍编译过程
{
ParameterExpression parameterExpression = Expression.Parameter(typeof(TSource), "p");
var memberBindingList = new List(); //表示绑定的类派生自的基类,这些绑定用于对新创建对象的成员进行初始化(vs的注解。太生涩了,我这样的小白解释不了,大家将就着看)
foreach (var item in typeof(TDestination).GetProperties()) //遍历目标类型的所有属性
{
MemberExpression property = Expression.Property(parameterExpression, typeof(TSource).GetProperty(item.Name)); //获取到对应的属性
MemberBinding memberBinding = Expression.Bind(item, property); //初始化这个属性
memberBindingList.Add(memberBinding);
}
foreach (var item in typeof(TDestination).GetFields())
{
MemberExpression property = Expression.Field(parameterExpression, typeof(TSource).GetField(item.Name)); //获取到对应的字段
MemberBinding memberBinding = Expression.Bind(item, property); //同上
memberBindingList.Add(memberBinding);
}
MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TDestination)), memberBindingList.ToArray()); //初始化创建新对象
Expression> lambda = Expression.Lambda>(memberInitExpression, parameterExpression);
func = lambda.Compile();
}
if (source == null)
{
return default(TDestination);
}
return ((Func)func)(source); //拼装是一次性的
}
///
/// 集合映射
///
///
///
///
///
public static IEnumerable Map(this IEnumerable source)
{
foreach (TSource s in source)
{
yield return s.Map();
}
}
///
/// 集合映射
///
///
///
///
///
public static IEnumerable Map(this IList source)
{
foreach (TSource s in source)
{
yield return s.Map();
}
}
///
/// 集合映射
///
///
///
///
///
public static IEnumerable Map(this ICollection source)
{
foreach (TSource s in source)
{
yield return s.Map();
}
}
}
}