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


    本文转自:https://blog.csdn.net/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的判断条件,这样我们就可以进行进一步的筛选。

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

  • 相关阅读:
    一步一步CCNA之二:路由器特权模式
    uncompress bz2
    Protothreads Lightweight, Stackless Threads in C
    sohu的正版美剧都挺不错的
    Ebot crawler
    大数据时代的创新者们
    technology company
    slogan
    娱乐新闻都怎么搞的,真不给力啊
    售楼小姐比较漂亮
  • 原文地址:https://www.cnblogs.com/freeliver54/p/9553187.html
Copyright © 2020-2023  润新知