【Mapper】类与类之间属性复制帮助类

 

参考自:https://www.cnblogs.com/gangle/p/11905331.html

 

public class MapperHelper
    {
        #region 适用于从表映射到界面定义类

        #region B类映射到A类(全属性赋值,不区分大小写)
        /// <summary>
        /// 传入类型B的对象b,将b与a相同名称的值进行赋值给创建的a中【全属性赋值,不区分大小写】    
        /// </summary>
        /// <typeparam name="A">类型A</typeparam>
        /// <typeparam name="B">类型B</typeparam>
        /// <param name="b">类型为B的参数b</param>
        /// <returns>拷贝b中相同属性的值的a</returns>
        public static A MapperTo<A, B>(B b)
        {
            return Newtonsoft.Json.JsonConvert.DeserializeObject<A>(Newtonsoft.Json.JsonConvert.SerializeObject(b));
        }
        #endregion

        #region B类映射到A类(全属性赋值,区分大小写)
        /// <summary>
        /// 传入类型B的对象b,将b与a相同名称的值进行赋值给创建的a中【全属性赋值,区分大小写】        
        /// </summary>
        /// <typeparam name="A">类型A</typeparam>
        /// <typeparam name="B">类型B</typeparam>
        /// <param name="b">类型为B的参数b</param>
        /// <returns>拷贝b中相同属性的值的a</returns>
        public static A MapperTo_V2<A, B>(B b)
        {
            A a = Activator.CreateInstance<A>();
            try
            {
                Type Typeb = typeof(B);//获得类型  
                Type Typea = typeof(A);
                foreach (PropertyInfo ap in Typea.GetProperties())
                {
                    System.Reflection.PropertyInfo bp = Typeb.GetProperty(ap.Name); //获取指定名称的属性
                    if (bp != null) //如果B对象也有该属性
                    {
                        if (ap.GetSetMethod() != null) //判断A对象是否有能用Set方法
                        {
                            if (bp.GetGetMethod() != null) //判断B对象是否有能用Get方法
                            {
                                ap.SetValue(a, bp.GetValue(b, null), null);//获得b对象属性的值复制给a对象的属性   
                            }
                        }
                    }

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return a;
        }
        #endregion

        #endregion

        #region 适用于从界面输入映射到表类

        #region 小类B属性复制到大类A中,替换A中的对应属性值(A类属性首字母大写)
        /// <summary>
        ///  小类B属性复制到大类A中,替换A中的对应属性值(A类属性首字母大写)
        /// </summary>
        /// <typeparam name="A">类型A</typeparam>
        /// <typeparam name="B">类型B</typeparam>
        /// <param name="b">类型为B的参数b</param>
        /// <returns>拷贝b中相同属性的值的a</returns>
        public static A MapperToFirstBig<A, B>(A a,B b)
        {
            try
            {
                Type Typeb = typeof(B);//获得类型  
                Type Typea = typeof(A);
                foreach (PropertyInfo bp in Typeb.GetProperties())
                {
                    System.Reflection.PropertyInfo ap = Typea.GetProperty(ConvertToUpper(bp.Name)); //获取指定名称的属性
                    if (ap != null) //如果B对象也有该属性
                    {
                        if (bp.GetSetMethod() != null) //判断A对象是否有能用Set方法
                        {
                            if (ap.GetGetMethod() != null) //判断B对象是否有能用Get方法
                            {
                                ap.SetValue(a, bp.GetValue(b, null), null);//获得b对象属性的值复制给a对象的属性   
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return a;
        }
        #endregion

        #region 小类B属性复制到大类A中,替换A中的对应属性值(A类属性首字母都小写的)
        /// <summary>
        ///  小类B属性复制到大类A中,替换A中的对应属性值(A类属性首字母都小写的)
        /// </summary>
        /// <typeparam name="A">类型A</typeparam>
        /// <typeparam name="B">类型B</typeparam>
        /// <param name="b">类型为B的参数b</param>
        /// <returns>拷贝b中相同属性的值的a</returns>
        public static A MapperToLower<A, B>(A a, B b)
        {
            try
            {
                Type Typeb = typeof(B);//获得类型  
                Type Typea = typeof(A);
                foreach (PropertyInfo bp in Typeb.GetProperties())
                {
                    System.Reflection.PropertyInfo ap = Typea.GetProperty(bp.Name.ToLower()); //获取指定名称的属性
                    if (ap != null) //如果B对象也有该属性
                    {
                        if (bp.GetSetMethod() != null) //判断A对象是否有能用Set方法
                        {
                            if (ap.GetGetMethod() != null) //判断B对象是否有能用Get方法
                            {
                                ap.SetValue(a, bp.GetValue(b, null), null);//获得b对象属性的值复制给a对象的属性   
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return a;
        }
        #endregion

        # region 返回所有单词首字改为大写后的结果
        /// <summary>
        /// 返回所有单词首字改为大写后的结果
        /// </summary>
        /// <param name="str">普通字符串</param>
        /// <returns>所有单词更改为首字母大写</returns>
        public static string ConvertToUpper(string str)
        {
            string s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
            return s;
        }
        #endregion

        #endregion
    }
View Code

 

posted @ 2021-03-03 10:54  狼窝窝  阅读(149)  评论(0)    收藏  举报