C# 快速高效率复制对象另一种方式 表达式树

1.传统方式进行对象赋值  2.反射或序列化动态赋值 3.通过表达式结合缓存赋值合适大量的数据复制

具体实现代码

 /// <summary>
        /// 复制对象(反射)
        /// </summary>
        /// <typeparam name="TIn">复制需要的对象</typeparam>
        /// <typeparam name="TOut">输出对象</typeparam>
        /// <param name="tIn"></param>
        /// <returns></returns>
        private static TOut TransReflection<TIn, TOut>(TIn tIn)
        {
            TOut tOut = Activator.CreateInstance<TOut>();
            foreach (var itemOut in tOut.GetType().GetProperties())
            {
                var itemIn = tIn.GetType().GetProperties().Where(i => i.Name == itemOut.Name).FirstOrDefault();
                if (itemIn != null)
                {
                    itemOut.SetValue(tOut, itemIn.GetValue(tIn));
                    Console.WriteLine(itemIn.GetValue(tIn));
                }
            }
            return tOut;
        }
        /// <summary>
        /// 表达式树 复制对象通用代码
        /// </summary>
        /// <typeparam name="TIn">复制需要的对象</typeparam>
        /// <typeparam name="TOut">输出对象</typeparam>
        /// <param name="tIn"></param>
        /// <returns></returns>
        private static TOut TransExp<TIn, TOut>(TIn tIn)
        {
            string key = string.Format("trans_exp_{0}_{1}", typeof(TIn).FullName, typeof(TOut).FullName);
            if (!_Dic.ContainsKey(key))
            {
                ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
                List<MemberBinding> memberBindingList = new List<MemberBinding>();

                foreach (var item in typeof(TOut).GetProperties())
                {
                    MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(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[] { parameterExpression });
                Func<TIn, TOut> func = lambda.Compile();

                _Dic[key] = func;
            }
            return ((Func<TIn, TOut>)_Dic[key])(tIn);
        }

  

原文:http://www.cnblogs.com/emrys5/p/expression_trans_model.html

原文地址:https://www.cnblogs.com/MingqiSs/p/7723250.html