实体类型互转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// S:源类型    T:目标类型 
       static List<T> ByExpTree<S, T>(List<S> list)
       {
           var props = typeof(S).GetProperties().Where(p => typeof(T).GetProperty(p.Name) != null).Select(x => new { a = x, b = typeof(T).GetProperty(x.Name) });
           var param = Expression.Parameter(typeof(S), "x");
           List<Expression> exps = new List<Expression>();
           var cre = Expression.New(typeof(T));
           var newb = Expression.Variable(typeof(T));
           var assb = Expression.Assign(newb, cre);
           exps.Add(assb);
           foreach (var item in props)
           {
               var getexp = Expression.MakeMemberAccess(param, item.a);
               var setexp = Expression.MakeMemberAccess(newb, item.b);
               var ass = Expression.Assign(setexp, getexp);
               exps.Add(ass);
           }
           exps.Add(newb);
           var body = Expression.Block(new ParameterExpression[] { newb }, exps);
           var sel = Expression.Lambda<Func<S, T>>(body, param);
           return list.Select(sel.Compile()).ToList();
       }

  PS:代码来源于网络,原本为固定类型互转,测试后发现此方式比反射及利用json快很多,修改调整为泛型方法,仅作记录。   有时我们仅有为数不多的类需要进行转换,不想使用第三方的map库,可使用此方法。

posted @   Coder_小菜  阅读(388)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示