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的判斷條件,這樣我們就可以進行進一步的篩選。

這個的原理就是利用反射獲得兩個對象的所有屬性字段,然后根據相同的名字進行復制,寫法可以有很多種的寫法,可以根據不同的屬性字段命名的方式來改寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM