zoukankan      html  css  js  c++  java
  • C#对象深表复制方法

     //反射
            public static TOut TransReflection<TIn, TOut>(TIn tIn)
            {
                TOut tOut = Activator.CreateInstance<TOut>();
                var tInType = tIn.GetType();
                foreach (var itemOut in tOut.GetType().GetProperties())
                {
                    var itemIn = tInType.GetProperty(itemOut.Name); ;
                    if (itemIn != null)
                    {
                        itemOut.SetValue(tOut, itemIn.GetValue(tIn,null),null);
                    }
                }
                return tOut;
            }
    
            //序列化
            public static TOut TransJsonConvert<TIn, TOut>(TIn tIn)
            {           
                return JsonConvert.DeserializeObject<TOut>(JsonConvert.SerializeObject(tIn));
            }
    using System.Linq.Expressions;
     /// <summary>
        /// 表达式树实现的深表复制
        /// </summary>
        /// <typeparam name="TIn"></typeparam>
        /// <typeparam name="TOut"></typeparam>
        public static class TransExp<TIn, TOut>
        {
    
            private static readonly Func<TIn, TOut> cache = GetFunc();
            private static Func<TIn, TOut> GetFunc()
            {
                ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
                List<MemberBinding> memberBindingList = new List<MemberBinding>();
    
                foreach (var item in typeof(TOut).GetProperties())
                {
                    if (!item.CanWrite)
                        continue;
    
                    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 });
    
                return lambda.Compile();
            }
    
            public static TOut Trans(TIn tIn)
            {
                return cache(tIn);
            }
        }
  • 相关阅读:
    《信息安全专业导论》第十一周学习总结
    模拟进程
    GPG实践
    信安导论2020-2021上第十三周总结(20201222)
    NMap
    信安导论2020-2021上第十二周总结(20201222)
    python模拟进程状态
    信安导论2020-2021上第十一周总结(20201222)
    信安导论2020-2021上第十周总结(20201222)
    Openssl 20201332
  • 原文地址:https://www.cnblogs.com/taofengfeng/p/11095467.html
Copyright © 2011-2022 走看看