原文地址:https://blog.csdn.net/u013093547/article/details/53584591
在使用c#进行程序编写时,会遇到一个问题,两个属性字段差不多相同的类要进行一个互相的转换,如
这样的两个类
[csharp] view plain copy
- class A
- {
- int Id;
- int age;
- string phone;
- string Name;
- string address;
- }
- class B
- {
- int Id;
- int age;
- string phone;
- string Name;
- string address;
- string email;
- }
这个时候,A a=new A();B b=new B();
我们要把a对象的所有字段的值都复制给b对象,我们只能用b.属性=a.属性来写,如果属性字段太多的话,就要写很多行复制语句,麻烦还容易漏掉一些,这个时候可以利用c#的反射来实现复制。我们可以写这样一个利用泛型的映射函数
[csharp] view plain copy
- public static D Mapper<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的判断条件,这样我们就可以进行进一步的筛选。
这个的原理就是利用反射获得两个对象的所有属性字段,然后根据相同的名字进行复制,写法可以有很多种的写法,可以根据不同的属性字段命名的方式来改写。