|
|
@ -63,37 +63,37 @@ namespace Wood.Util |
|
|
|
/// <summary>
|
|
|
|
/// Expression动态拼接+泛型缓存
|
|
|
|
/// </summary>
|
|
|
|
/// <typeparam name="TIn"></typeparam>
|
|
|
|
/// <typeparam name="TOut"></typeparam>
|
|
|
|
public class EntityMapper<TIn, TOut>//Mapper`2
|
|
|
|
/// <typeparam name="TSource"></typeparam>
|
|
|
|
/// <typeparam name="TTarget"></typeparam>
|
|
|
|
public class EntityMapper<TSource, TTarget>//Mapper`2
|
|
|
|
{ |
|
|
|
private static Func<TIn, TOut> _FUNC = null; |
|
|
|
private static Func<TSource, TTarget> _FUNC = null; |
|
|
|
static EntityMapper() |
|
|
|
{ |
|
|
|
ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p"); |
|
|
|
ParameterExpression parameterExpression = Expression.Parameter(typeof(TSource), "p"); |
|
|
|
List<MemberBinding> memberBindingList = new List<MemberBinding>(); |
|
|
|
foreach (var item in typeof(TOut).GetProperties()) |
|
|
|
foreach (var item in typeof(TTarget).GetProperties()) |
|
|
|
{ |
|
|
|
MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name)); |
|
|
|
MemberExpression property = Expression.Property(parameterExpression, typeof(TSource).GetProperty(item.Name)); |
|
|
|
MemberBinding memberBinding = Expression.Bind(item, property); |
|
|
|
memberBindingList.Add(memberBinding); |
|
|
|
} |
|
|
|
foreach (var item in typeof(TOut).GetFields()) |
|
|
|
foreach (var item in typeof(TTarget).GetFields()) |
|
|
|
{ |
|
|
|
MemberExpression property = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name)); |
|
|
|
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(TOut)), memberBindingList.ToArray()); |
|
|
|
Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[] |
|
|
|
MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TTarget)), memberBindingList.ToArray()); |
|
|
|
Expression<Func<TSource, TTarget>> lambda = Expression.Lambda<Func<TSource, TTarget>>(memberInitExpression, new ParameterExpression[] |
|
|
|
{ |
|
|
|
parameterExpression |
|
|
|
}); |
|
|
|
_FUNC = lambda.Compile();//拼装是一次性的
|
|
|
|
} |
|
|
|
public static TOut Trans(TIn t) |
|
|
|
public static TTarget Trans(TSource tSource) |
|
|
|
{ |
|
|
|
return _FUNC(t); |
|
|
|
return _FUNC(tSource); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -103,35 +103,28 @@ namespace Wood.Util |
|
|
|
/// </summary>
|
|
|
|
public class EntityMapper |
|
|
|
{ |
|
|
|
/// <summary>
|
|
|
|
/// 反射
|
|
|
|
/// </summary>
|
|
|
|
/// <typeparam name="TIn"></typeparam>
|
|
|
|
/// <typeparam name="TOut"></typeparam>
|
|
|
|
/// <param name="tIn"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
public static void Trans<TIn, TOut>(TIn tIn, TOut tOut, string excludeMembers = "") |
|
|
|
public static void Trans<TSource, TTarget>(TSource tSource, TTarget tTarget, string excludeMembers = "") |
|
|
|
{ |
|
|
|
string[] excludeMemberArr = excludeMembers.Split(",").Select(itm => itm.Trim()).ToArray(); |
|
|
|
|
|
|
|
foreach (var itemOut in tOut.GetType().GetProperties()) |
|
|
|
foreach (var itemOut in tTarget.GetType().GetProperties()) |
|
|
|
{ |
|
|
|
if (excludeMemberArr.Contains(itemOut.Name)) |
|
|
|
{ |
|
|
|
continue; |
|
|
|
} |
|
|
|
var propIn = tIn.GetType().GetProperty(itemOut.Name); |
|
|
|
itemOut.SetValue(tOut, propIn.GetValue(tIn, null), null); |
|
|
|
var propIn = tSource.GetType().GetProperty(itemOut.Name); |
|
|
|
itemOut.SetValue(tTarget, propIn.GetValue(tSource, null), null); |
|
|
|
} |
|
|
|
|
|
|
|
foreach (var itemOut in tOut.GetType().GetFields()) |
|
|
|
foreach (var itemOut in tTarget.GetType().GetFields()) |
|
|
|
{ |
|
|
|
if (excludeMemberArr.Contains(itemOut.Name)) |
|
|
|
{ |
|
|
|
continue; |
|
|
|
} |
|
|
|
var fieldIn = tIn.GetType().GetField(itemOut.Name); |
|
|
|
itemOut.SetValue(tOut, fieldIn.GetValue(tIn)); |
|
|
|
var fieldIn = tSource.GetType().GetField(itemOut.Name); |
|
|
|
itemOut.SetValue(tTarget, fieldIn.GetValue(tSource)); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|