原文地址: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的判斷條件,這樣我們就可以進行進一步的篩選。
這個的原理就是利用反射獲得兩個對象的所有屬性字段,然后根據相同的名字進行復制,寫法可以有很多種的寫法,可以根據不同的屬性字段命名的方式來改寫。