[转]C#利用反射实现两个类的对象之间相同属性的值的复制

本文介绍在C#程序编写中,当两个属性字段相近的类需相互转换时,若属性字段多,逐个复制麻烦且易遗漏。可利用C#的反射实现复制,还能通过改变GetProperties()函数和if判断条件进行进一步筛选,原理是根据属性名复制。

本文转自:https://blog.youkuaiyun.com/u013093547/article/details/53584591

 

在使用c#进行程序编写时,会遇到一个问题,两个属性字段差不多相同的类要进行一个互相的转换,如

 

这样的两个类

  1.  
    class A
  2.  
    {
  3.  
    int Id;
  4.  
    int age;
  5.  
    string phone;
  6.  
    string Name;
  7.  
    string address;
  8.  
    }
  9.  
     
  10.  
    class B
  11.  
    {
  12.  
    int Id;
  13.  
    int age;
  14.  
    string phone;
  15.  
    string Name;
  16.  
    string address;
  17.  
    string email;
  18.  
    }

 

这个时候,A a=new A();B b=new B(); 我们要把a对象的所有字段的值都复制给b对象,我们只能用b.属性=a.属性来写,如果属性字段太多的话,就要写很多行复制语句,麻烦还容易漏掉一些,这个时候可以利用c#的反射来实现复制。我们可以写这样一个利用泛型的映射函数

 

        public static D CloneProperty<D, S>(S s)
        {
            D d = Activator.CreateInstance<D>();
            try
            {
                var Types = s.GetType();//获得类型
                var Typed = typeof(D);
                foreach (PropertyInfo sp in Types.GetProperties())//获得类型的属性字段
                {
                    foreach (PropertyInfo dp in Typed.GetProperties())
                    {
                        if (dp.Name == sp.Name)//判断属性名是否相同
                        {
                            dp.SetValue(d, sp.GetValue(s, null), null);//获得s对象属性的值复制给d对象的属性
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return d;
        }

 

这样我们就可以进行转换了,同样,我们还可以利用字段的访问属性,字段的类型,命名等在进行进一步的删选,我们只需要改变GetProperties()函数和if的判断条件,这样我们就可以进行进一步的筛选。

这个的原理就是利用反射获得两个对象的所有属性字段,然后根据相同的名字进行复制,写法可以有很多种的写法,可以根据不同的属性字段命名的方式来改写。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值