在要求输入邮箱的文本域,请填写真实的邮件地址。非真实邮件地址,将收不到回复信息。

C#使用反射为两个对象的相同属性赋值

C# 清风 83℃ 0评论

最近有遇到两个对象的赋值问题,两个对象的属性几乎都一样的,所以写了个通过反射获取属性的然后赋值的方法,把一个对象的属性的值赋值给另对象。


public static class MapperHelper
    {
        /// <summary>
        /// 反射实现两个类的对象之间相同属性的值的复制
        /// 适用于初始化新实体
        /// </summary>
        /// <typeparam name="R">返回的实体</typeparam>
        /// <typeparam name="S">数据源实体</typeparam>
        /// <param name="s">数据源实体</param>
        /// <returns>返回的新实体</returns>
        public static R Mapper<R, S>(S s)
        {
            R r = Activator.CreateInstance<R>(); //构造新实例
            try
            {
                var Types = s.GetType();//获得类型  
                var Typed = typeof(R);
                foreach (PropertyInfo sp in Types.GetProperties())//获得类型的属性字段  
                {
                    foreach (PropertyInfo dp in Typed.GetProperties())
                    {
                        if (dp.Name == sp.Name && dp.PropertyType == sp.PropertyType && dp.Name != "Error" && dp.Name != "Item")//判断属性名是否相同  
                        {
                            dp.SetValue(r, sp.GetValue(s, null), null);//获得s对象属性的值复制给r对象的属性  
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return r;
        }
        /// <summary>
        /// 反射实现两个类的对象之间相同属性的值的复制
        /// 适用于没有新建实体之间
        /// </summary>
        /// <typeparam name="R">返回的实体</typeparam>
        /// <typeparam name="S">数据源实体</typeparam>
        /// <param name="r">返回的实体</param>
        /// <param name="s">数据源实体</param>
        /// <param name="isContainsNull">字段为null是否的跳过</param>
        /// <param name="isContainsEmpty">字段为空字符串的是否的跳过</param>
        /// <returns></returns>
        public static R MapperToModel<R, S>(R r, S s,bool isContainsNull=true,bool isContainsEmpty=true)
        {
            try
            {
                var Types = s.GetType();//获得类型  
                var Typed = typeof(R);
                foreach (PropertyInfo sp in Types.GetProperties())//获得类型的属性字段  
                {
                    foreach (PropertyInfo dp in Typed.GetProperties())
                    {
                        if (dp.Name == sp.Name && dp.PropertyType == sp.PropertyType && dp.Name != "Error" && dp.Name != "Item")//判断属性名是否相同  
                        {
                            object val = sp.GetValue(s, null);
                            if (!isContainsNull && val == null)
                            {
                                continue;
                            }
                            if (!isContainsEmpty && val != null &&
                                (val is string) && string.IsNullOrWhiteSpace(val.ToString()))
                            {
                                continue;
                            }
                            dp.SetValue(r, val, null);//获得s对象属性的值复制给r对象的属性  
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return r;
        }
    }

转载请注明:清风博客 » C#使用反射为两个对象的相同属性赋值

喜欢 (0)or分享 (0)
支付宝扫码打赏 微信打赏
发表我的评论
取消评论

CAPTCHA Image
Reload Image
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址