程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 【轉】利用反射快速給Model實體賦值,反射model實體賦值

【轉】利用反射快速給Model實體賦值,反射model實體賦值

編輯:C#入門知識

【轉】利用反射快速給Model實體賦值,反射model實體賦值


原文地址:http://blog.csdn.net/gxiangzi/article/details/8629064

試想這樣一個業務需求:有一張合同表,由於合同涉及內容比較多所以此表比較龐大,大概有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,其它字段一模一樣。簡單定義如下:

class Class1  
    {  
        private string id;  
  
        public string Id  
        {  
            get { return id; }  
            set { id = value; }  
        }  
        private string name;  
  
        public string Name  
        {  
            get { return name; }  
            set { name = value; }  
        }  
        private int age;  
  
        public int Age  
        {  
            get { return age; }  
            set { age = value; }  
        }  
        private int num;  
  
        public int Num  
        {  
            get { return num; }  
            set { num = value; }  
        }  
  
    }  
class Class2  
    {  
        private string newid;  
  
        public string Newid  
        {  
            get { return newid; }  
            set { newid = value; }  
        }  
  
        private string id;  
  
        public string Id  
        {  
            get { return id; }  
            set { id = value; }  
        }  
        private string name;  
  
        public string Name  
        {  
            get { return name; }  
            set { name = value; }  
        }  
        private int age;  
  
        public int Age  
        {  
            get { return age; }  
            set { age = value; }  
        }  
        private int num;  
  
        public int Num  
        {  
            get { return num; }  
            set { num = value; }  
        }  
    }  

下面我們給class1賦值,然後通過反射獲取class2的屬性,循環把class1對應的值賦給class2,遇到class2多出的字段我們手功處理後跳過。簡單代碼如下:

Class1 c1 = new Class1();  
         c1.Id = "001";  
         c1.Name = "ben.jiang";  
         c1.Num = 712104195;  
         c1.Age = 24;  
  
         Class2 c2 = new Class2();  
         Type t2 = typeof(Class2);  
         PropertyInfo[] propertys2 = t2.GetProperties();  
  
         Type t1 = typeof(Class1);  
         PropertyInfo[] propertys1 = t1.GetProperties();  
  
         foreach (PropertyInfo pi in propertys2)  
         {  
             string name = pi.Name;  
             if (name == "Newid")  
             {  
                 c2.Newid = "newid";  
                 continue;  
             }  
  
             object value=t1.GetProperty(name).GetValue(c1, null);  
             t2.GetProperty(name).SetValue(c2,value ,null);  
         }  

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved