1. 程式人生 > >同類型物件利用反射自動賦值

同類型物件利用反射自動賦值

    CSDN廣告是越來越多了,所有部落格筆記不再更新,新網址 DotNet筆記

同一種類型的兩個物件賦值,用反射。避免了一直點屬性操作的麻煩.

下面是幫助類程式碼:

 public class ObjectAssign
    {

        /// <summary>
        /// 物件賦值
        /// </summary>
        /// <typeparam name="T"><peparam>
        /// <param name="left">被賦值物件(等號左邊的)</param>
        /// <param name="right">賦值物件(等號右邊的)</param>
        /// <param name="id">不修改的欄位,eg:Test.Assignment<tb_goods_class>(tt, t, new string[]{"id","productName"});</param>
        public static void Assign<T>(T left, T right,string []attrs=null)
        {
            Type type = left.GetType();
            List<PropertyInfo> pList = type.GetProperties().ToList();
            for (int i = 0; i < pList.Count; i++)
            {
                //根據屬性名獲得指定的屬性物件
                PropertyInfo gc = type.GetProperty(pList[i].Name);
                //設定屬性的值
                if (attrs != null&&attrs.Length>0)
                {
                    string attrName = pList[i].Name.ToLower();
                    if (!attrs.Contains(attrName))
                    {
                        gc.SetValue(left, pList[i].GetValue(right, null), null);
                    }
                }
                else
                {
                    gc.SetValue(left, pList[i].GetValue(right, null), null);
                }

            }
        }
    }

下面是使用方式,大家可以打個斷點看看結果:

        private void btnStart_Click(object sender, EventArgs e)
        {
            Entity.Entities ee = new Entity.Entities();
            tb_goods_class tt = ee.tb_goods_class.OrderByDescending(r => r.id).Take(1).FirstOrDefault();
            tb_goods_class t = new tb_goods_class();
            t.anotherName = DateTime.Now.ToString();
            t.keywords = DateTime.Now.ToString();
            t.id = 1;
            //"id", "keywords" 不需要被賦值
            ObjectAssign.Assign<tb_goods_class>(tt, t, new string[] { "id", "keywords" });
            //任何欄位都要被賦值
            ObjectAssign.Assign<tb_goods_class>(tt, t, new string[] { });
            ObjectAssign.Assign<tb_goods_class>(tt, t, null);
            ObjectAssign.Assign<tb_goods_class>(tt, t);
        }


相關推薦

同類物件利用反射自動

    CSDN廣告是越來越多了,所有部落格筆記不再更新,新網址 DotNet筆記 同一種類型的兩個物件賦值,用反射。避免了一直點屬性操作的麻煩. 下面是幫助類程式碼: public class

利用反射實現JavaBean的自動(六)

最近開發公司的一個專案,因專案不是很大的專案,所以僅僅採用了spring MVC框架,但是資料庫很多表中的欄位至少15個,這樣當每次將資料庫表中的資料取出來放入javabean中時,寫setXXX方法總是要寫很多遍,而且容易出錯,很是麻煩,所以採用了反射和泛型的方式,自動

利用反射自動為屬性

如果一個類中有多個屬性,則客戶端在為屬性賦值時要呼叫多個set或get方法,這樣十分麻煩,也使得程式碼不夠簡潔。這裡利用反射的技術來使得只要利用幾行簡短的程式碼既可以完成有許多屬性的類的自動賦值。 package com.mldn.demo; import java.la

java 物件的成員變數兼任型別, (若有泛也相容型別)

在學Spring 依賴注入 通過 註解@Autowired 可以自動執行欄位, 方法等. 很好奇那欄位是如何相容型別賦值的, 而且自動泛型注入(判斷)     功能沒有做完, 做的也很籠統, 希望指教。      /*  

編寫程式由從標準輸入裝置讀入的元素資料建立一個intvector物件,然後動態建立一個與該vector物件大小一致的陣列,把vector物件的所有元素給新陣列

先建立一個含有若干int型的vector容器,變數名為ivec。用標準輸入來初始化這個容器的每一個元素。 再動態建立一個int型陣列,利用迭代器來遍歷容器,並利用容器來初始化動態建立的陣列 最後的cout<<*(p-10)是返回到了陣列的最開始的位置,p指標又重新指向了第一個元素

反射呼叫方法,例項化物件,欄位

準備一個類,有參構造方法,欄位,方法都是私有的 public class Car { private String name; private Integer age;

JavaSE8基礎 在構造代碼塊中給final類的成員變量

變量賦值 技術 es2017 類型 log window image jdk eclipse os :windows7 x64 jdk:jdk-8u131-windows-x64 ide:Eclipse Oxygen Release (4.7.0)

jq form表單自動

+= each radi 鏈接 是否 如果 != image def (function ($) { $.fn.extend({ initForm: function (options) { //默認參數 var defaults = { formdata: "", is

PowerDesigner顯示Common註釋列並自動

pac ali packages physical inter msgbox pan tables des PowerDesigner中默認不顯示Common註釋列,可根據以下步驟顯示並紫東填充Name列內容。 1、顯示Common註釋列 2、運行VB Script腳本自

springboot~ObjectMapper~dto到entity的自動

spring 解決 bind new ndb 默認 find 工具類 轉換 實體與Dto自動賦值 在開發的過程中,實體之間相互賦值是很正常的事,但是我們一般的方法都通過set和get方法來進行的,如果要賦值的字段少那還行,但是需要賦值的字段超過10個,那就是個災難,你會看到

物件的解構(字串、布林、函式)

解構的值,必須要為物件的key值,不然會為undefined   let {key1,key2,key3:k3} = objk3就代表key3 ,當寫了:k3時,key3就失效就報錯。  ({key1:obj2.xx,key2:arr[n]} = obj)                       

物件的複製和

物件的複製是在物件宣告時進行的操作,而賦值是在宣告之後的操作。一般而言,複製的語法為A a(b),A為類,b為已經定義的物件,a為複製b的物件;賦值的語法為A a;a = b;需要先宣告物件a,之後再對其進行賦值。 有一種特殊的情況,A a=b;雖然是使用了操作符=,但由於是在物件宣告時,進行定

【ES6】物件的解構

物件的解構賦值 解構不僅可以用於陣列(陣列解構賦值),還可以用於物件。 let { foo, bar } = { foo: "aaa", bar: "bbb" }; foo // "aaa" bar // "bbb" 物件的解構與陣列的解構的區別: 陣列的元素是按次序排列的,變

protobuf通過反射

最近因為專案邏輯方面都做的差不多了,於是趕緊去做做測試工作,免得專案上線之後出問題,於是打算用配置的形式做一個類似與白盒測試工具的東西出來。因為專案使用pb來做協議通訊,所以配置的xml也是類似於pb,將pb的欄位和型別配置進去,然後加上值,一個協議結構就可以了,現在只能通過修改值來做測試,後面會改動的更智慧

利用二次變數,實現不同點擊顯隱——wepy框架

  點選當前A標題,傳送請求展示下拉框,再次點選A隱藏下拉框 點選B標題傳送請求展示下拉框,再次點選A隱藏下拉框 特殊要求: 當A展開時,點選B,要求:A的下拉框隱藏,B的下拉框展示 遇到的困難: 點選B時,A不會自動隱藏。 或者 點選A時,A無法手動隱藏

為什麼C++中的物件之間能夠進行

C++中所有的 型別 變數都是 類 物件的形式,那麼C++中類物件之間是怎麼進行賦值操作的呢? 主要是因為C++存在拷貝建構函式,拷貝建構函式的定義如下所示: 類名(類名 &); 具體的例項如下所示: #include <iostream> using

使用tolua++匯出C++物件中的字串問題

   tolua++能夠將c++中的物件匯出到lua中,並在lua中賦值,但對於字串,卻存在支援上的問題,如: // tolua_begin  #define MAX_LEN 10 struct SExample {     int     Num;      ch

C++順序容器類中物件初始化、、swap

順序容器中,對於初始化物件,除了使用列表和一對迭代器初始化物件時,列表中元素和求迭代器所引用的值跟初始化的物件相容即可。其他的都需要保證型別完全相同 至於賦值,C++順序容器來還定義了一個assig

利用解構快速提取JSON的

let jsonData = {  id: 42,  status: "OK",  data: [323, 333]}let { id, status, data: number} = jsonData

ES6 物件的解構

ES6的解構賦值,在我看來是提供了一個整體賦值的方案。包括陣列和物件的整體賦值。基本原則如下:陣列的元素是按次序排列的,變數的取值由它的位置決定;物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值。陣列的解構賦值:let [x, y]= [1, 2];// x = 1// y = 2物件的解構賦值:le