1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Linq.Expressions;
5 using System.Text;
6 using System.Threading.Tasks;
7
8 namespace ExpressionDemo.MappingExtend
9 {
10 /// <summary>
11 /// 生成表达式目录树 泛型缓存
12 /// </summary>
13 /// <typeparam name="TIn"></typeparam>
14 /// <typeparam name="TOut"></typeparam>
15 public class ExpressionGenericMapper<TIn, TOut>//Mapper`2
16 {
17 private static Func<TIn, TOut> _FUNC = null;
18 static ExpressionGenericMapper()
19 {
20 ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
21 List<MemberBinding> memberBindingList = new List<MemberBinding>();
22 foreach (var item in typeof(TOut).GetProperties())
23 {
24 MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));
25 MemberBinding memberBinding = Expression.Bind(item, property);
26 memberBindingList.Add(memberBinding);
27 }
28 foreach (var item in typeof(TOut).GetFields())
29 {
30 MemberExpression property = Expression.Field(parameterExpression, typeof(TIn).GetField(item.Name));
31 MemberBinding memberBinding = Expression.Bind(item, property);
32 memberBindingList.Add(memberBinding);
33 }
34 MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());
35 Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[]
36 {
37 parameterExpression
38 });
39 _FUNC = lambda.Compile();//拼装是一次性的
40 }
41 public static TOut Trans(TIn t)
42 {
43 return _FUNC(t);
44 }
45 }
46 }