zoukankan      html  css  js  c++  java
  • C#利用反射实现两个类的对象之间相同属性的值的复制,一个对象的属性复制给另一个对性的属性


    原文地址:https://blog.csdn.net/u013093547/article/details/53584591


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

    这样的两个类

    [csharp] view plain copy

    1. class A 
    2. int Id; 
    3. int age; 
    4. string phone; 
    5. string Name; 
    6. string address; 
    7. class B 
    8. int Id; 
    9. int age; 
    10. string phone; 
    11. string Name; 
    12. string address; 
    13. string email; 

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

    [csharp] view plain copy

    1. public static D Mapper<D,S>(S s) 
    2.        { 
    3.            D d = Activator.CreateInstance<D>(); 
    4. try
    5.            { 
    6.                var Types = s.GetType();//获得类型
    7.                var Typed = typeof(D); 
    8. foreach(PropertyInfo  sp in Types.GetProperties())//获得类型的属性字段
    9.                { 
    10. foreach (PropertyInfo dp in Typed.GetProperties()) 
    11.                    { 
    12. if(dp.Name==sp.Name)//判断属性名是否相同
    13.                        { 
    14.                            dp.SetValue(d, sp.GetValue(s, null), null);//获得s对象属性的值复制给d对象的属性
    15.                        } 
    16.                    } 
    17.                } 
    18.            } 
    19. catch(Exception ex) 
    20.            { 
    21. throw ex; 
    22.            } 
    23. return d; 
    24.        } 

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

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

  • 相关阅读:
    hello
    1234566i 还是规范
    萨嘎给
    DRF 商城项目
    DRF 商城项目
    DRF 商城项目
    Windows 上连接本地 Linux虚拟机上的 mysql 数据库
    xadmin 数据添加报错: IndexError: list index out of range
    python 实现聊天室
    xadmin 组件拓展自定义使用
  • 原文地址:https://www.cnblogs.com/suizhikuo/p/9205838.html
Copyright © 2011-2022 走看看