您的位置:时时app平台注册网站 > 编程知识 > 通过品质实行浅拷贝【时时app平台注册网站】

通过品质实行浅拷贝【时时app平台注册网站】

2019-12-06 10:51
public class HumanVo
    {
        private string _name;
        private int _age;
        private bool _sex;

        public string Name
        {
            get
            {
                return _name;
            }

            set
            {
                _name = value;
            }
        }

        public int Age
        {
            get
            {
                return _age;
            }

            set
            {
                _age = value;
            }
        }

        public bool Sex
        {
            get
            {
                return _sex;
            }

            set
            {
                _sex = value;
            }
        }
    }

public class StudentVo
    {
        private string _name;
        private int _age;
        private bool _sex;
        private string _class;
        private string _school;

        public string Name
        {
            get
            {
                return _name;
            }

            set
            {
                _name = value;
            }
        }

        public int Age
        {
            get
            {
                return _age;
            }

            set
            {
                _age = value;
            }
        }

        public bool Sex
        {
            get
            {
                return _sex;
            }

            set
            {
                _sex = value;
            }
        }

        public string Class
        {
            get
            {
                return _class;
            }

            set
            {
                _class = value;
            }
        }

        public string School
        {
            get
            {
                return _school;
            }

            set
            {
                _school = value;
            }
        }
    }

1、给PropertyInfo[]项目加个扩张的主意,方便实行查询是不是留存相通等级次序,相似名称的字段。

调用方法在此之前,追踪代码,看三个VO的值

3、调用CopyTo方法

private void AddInfo()
        {
            HumanVo.Name = "李蕾";
            HumanVo.Age = 16;
            HumanVo.Sex = true;
        }

4、查看结果

一、方法体

时时app平台注册网站 1

     /// <summary>
        /// PropertyInfo[]扩展方法,通过名称获得属性
        /// </summary>
        /// <param name="P"></param>
        /// <param name="pro"></param>
        /// <returns></returns>
        private static PropertyInfo GetPropertyByName(this PropertyInfo[] P,PropertyInfo pro)
        {
            if (P == null)
                throw new NullReferenceException("CopyHelper类中GetPropertyByName()方法参数PropertyInfo[]为Null");
            var item = P.ToList().Find(x => x.Name.Equals(pro.Name) &&
              (pro.PropertyType.IsSubclassOf(x.PropertyType) || pro.PropertyType.FullName.Equals(x.PropertyType.FullName)));
            return item;
        }

调用方法后,查看StudentVO的值

1、新建四个实体类,HumanVo和StudentVo

2、给HumanVo进行赋值

HumanVo.CopyTo(StudentVo);

  是二个静态方法CopyHelper,饱含以下多个部分

     /// <summary>
        /// 浅拷贝
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="vo">原始的VO</param>
        /// <param name="viewModel">VM下的vo</param>
        /// <returns></returns>
        private static T O2M<T>(object vo,T viewModel)
        {
            //获取viewmodel的属性集合
            PropertyInfo[] VmPInfos = viewModel.GetType().GetProperties();
            //获取原始vo的属性集合
            PropertyInfo[] VoPInfos = vo.GetType().GetProperties();
            for (int i = 0; i < VoPInfos.Length; i  )
            {
                //从VM中找到和VO中对应的属性
                var pro = VmPInfos.GetPropertyByName(VoPInfos[i]);
                //如果不为空,并且可以写,则进行赋值
                if (pro != null && pro.CanWrite)
                    pro.SetValue(viewModel, VoPInfos[i].GetValue(vo, null), null);
            }
            return viewModel;
        }

        private static T O2M<T>(object vo) where T :new ()
        {
            if (vo == null)
                return default(T);
            T viewModel = new T();
            return O2M<T>(vo, viewModel);
        }

时时app平台注册网站 2时时app平台注册网站 3

二、测试

3、向外暴光八个扩张Copy方法,运维调用

这两日看三个要离职同事交接的代码,看见三个浅拷贝的措施感到蛮好,在此边记录一下。

2、浅拷贝的关键性方法,即调用上面包车型客车办法底工上,假诺不为空,并且同意写入的话,则用SetValue方法进行赋值

     /// <summary>
        /// 将字段名称一致,类型一致的属性赋值(用于ViewModel和Vo相互转化)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="vo"></param>
        /// <returns></returns>
        /// <remarks>注意此赋值为浅拷贝,Model会重新new()</remarks>
        public static T CopyTo<T>(this object vo) where T :new()
        {
            return O2M<T>(vo);
        }
        /// <summary>
        /// 将字段名称一致,类型一致的属性赋值(用于ViewModel和Vo相互转化)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="vo"></param>
        /// <returns></returns>
        /// <remarks>注意此赋值为浅拷贝,Model会重新new()</remarks>
        public static bool CopyTo<T>(this object vo,T model)where T :new ()
        {
            if (model == null)
                model = new T();
            return O2M<T>(vo, model) != null;
        }

本文由时时app平台注册网站发布于编程知识,转载请注明出处:通过品质实行浅拷贝【时时app平台注册网站】

关键词: