实体类型互转
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库,可使用此方法。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步