利用反射快速給Model實體賦

世紀緣發表於2016-10-17

試想這樣一個業務需求:有一張合同表,由於合同涉及內容比較多所以此表比較龐大,大概有120多個欄位。現在合同每一次變更時都需要對合同原始資訊進行歸檔一次,版本號依次遞增。那麼我們就要新建一張合同歷史表,欄位跟原合同表一模一樣,此外多了一個 合同版本號 欄位。在歸檔時如何把原始合同資訊插入到合同歷史表呢?

        很容易就能想到的一種解決方法:

insert into 合同歷史表(欄位1,欄位2,欄位3…………欄位120,版本號) select   欄位1,欄位2,欄位3…………欄位120,0 as 版本號 from 合同表 where 合同ID=‘xxxxxxx’

這樣當然是能實現我們的功能的,但是看到了嗎?由於表的欄位太多,導致SQL看起來很不優雅,而且欄位之間的對應很容易出問題。聯想起之前看過的 利用反射給model賦值的例子想出來下面的一個解決方法:

       現在假設兩個實體class1、class2,class2只比class1多一個欄位newid,其它欄位一模一樣。簡單定義如下:

[csharp] view plain copy
 print?
  1. class Class1  
  2.     {  
  3.         private string id;  
  4.   
  5.         public string Id  
  6.         {  
  7.             get { return id; }  
  8.             set { id = value; }  
  9.         }  
  10.         private string name;  
  11.   
  12.         public string Name  
  13.         {  
  14.             get { return name; }  
  15.             set { name = value; }  
  16.         }  
  17.         private int age;  
  18.   
  19.         public int Age  
  20.         {  
  21.             get { return age; }  
  22.             set { age = value; }  
  23.         }  
  24.         private int num;  
  25.   
  26.         public int Num  
  27.         {  
  28.             get { return num; }  
  29.             set { num = value; }  
  30.         }  
  31.   
  32.     }  

[csharp] view plain copy
 print?
  1. class Class2  
  2.     {  
  3.         private string newid;  
  4.   
  5.         public string Newid  
  6.         {  
  7.             get { return newid; }  
  8.             set { newid = value; }  
  9.         }  
  10.   
  11.         private string id;  
  12.   
  13.         public string Id  
  14.         {  
  15.             get { return id; }  
  16.             set { id = value; }  
  17.         }  
  18.         private string name;  
  19.   
  20.         public string Name  
  21.         {  
  22.             get { return name; }  
  23.             set { name = value; }  
  24.         }  
  25.         private int age;  
  26.   
  27.         public int Age  
  28.         {  
  29.             get { return age; }  
  30.             set { age = value; }  
  31.         }  
  32.         private int num;  
  33.   
  34.         public int Num  
  35.         {  
  36.             get { return num; }  
  37.             set { num = value; }  
  38.         }  
  39.     }  

下面我們給class1賦值,然後通過反射獲取class2的屬性,迴圈把class1對應的值賦給class2,遇到class2多出的欄位我們手功處理後跳過。簡單程式碼如下:

[csharp] view plain copy
 print?
  1. Class1 c1 = new Class1();  
  2.          c1.Id = "001";  
  3.          c1.Name = "ben.jiang";  
  4.          c1.Num = 712104195;  
  5.          c1.Age = 24;  
  6.   
  7.          Class2 c2 = new Class2();  
  8.          Type t2 = typeof(Class2);  
  9.          PropertyInfo[] propertys2 = t2.GetProperties();  
  10.   
  11.          Type t1 = typeof(Class1);  
  12.          PropertyInfo[] propertys1 = t1.GetProperties();  
  13.   
  14.          foreach (PropertyInfo pi in propertys2)  
  15.          {  
  16.              string name = pi.Name;  
  17.              if (name == "Newid")  
  18.              {  
  19.                  c2.Newid = "newid";  
  20.                  continue;  
  21.              }  
  22.   
  23.              object value=t1.GetProperty(name).GetValue(c1, null);  
  24.              t2.GetProperty(name).SetValue(c2,value ,null);  
  25.          }  

這樣程式碼看起來稍微優雅了一些,而且針對不同的欄位我們處理起來也方便。

相關文章