c 泛型 反射

2021-09-08 16:41:34 字數 1338 閱讀 5142

程式的賬套模組,有乙個賬套間相互複製資料的功能,有幾個表需要實現這個功能。這些表有共有屬性:user_id和count_set_id。為了節省**,我用乙個介面規範了這幾個類,其中介面包含上面兩個屬性。

資料的操作是在linq to sql的基礎上實現的。所以操作大物件是dataclasses1datacontext db,自物件是db.table.

具體的操作是,針對表一,有兩個key,userid+countsetid。首先需要查詢舊countsetid下的所有資料,然後修改其countsetid為目標id,最後全部插入到資料庫,完成。

擴充套件功能:在複製資料之前,可能要先刪除目標id下的所有資料。

void copycountsetsub(system.data.linq.tabledata, int sourceid, int targetid, bool

deleteb4copy)

where t : class

, icountset

var targetdata = data.where(x => x.user_id == userid && x.count_set_id ==sourceid).tolist();

targetdata.foreach(x =>);

}

上面的方法的引數:system.data.linq.tabledata將整個資料庫對映物件傳遞過來。nt sourceid是源賬套id,int targetid是目標賬套id,bool deleteb4copy則表示是否在複製前刪除。

where t : class, icountset。約束此泛型方法的型別。其必須是類,必須繼承自介面icountset。繼承介面的作用是為了在方法中呼叫x.user_id和x.count_set_id。

方法的內容邏輯很明確:首先判斷執行刪除,然後賦值舊資料,在舊資料的基礎上生成新資料,然後插入資料庫。

這裡有乙個擴充套件,泛型型別的帶乙個引數的建構函式。本來泛型約束中有new(),如果where 後面約束了new(),可以這麼做:   t newone = new t();使用前提是t必須有無引數的建構函式。而在這裡,我們需要 t newone = new t(x);沒有new(t)的約束,直接這麼敲**,肯定得錯,在這個泛型方法裡面,不能判斷t是否有這麼乙個建構函式。最後值得用反射來獲得t的帶引數的建構函式t newx = (t)system.activator.createinstance(typeof(t), x); 傳入x作為引數,建立乙個例項並強制轉換成型別t。隨後修改newx的count_set_id的值,然後插入資料庫即即刻。

本片重點:泛型的使用;泛型的約束where,包括new(),class,iinte***ce等;反射獲取型別的帶引數的建構函式並建立例項。

C 反射泛型

c 泛型反射和普通反射的區別,泛型反射和普通反射的區別就是泛型引數的處理上 先看乙個簡單的例子。class class1 要利用反射動態建立該型別例項,並呼叫 test 方法,我們可以使用如下方法 type type typeof class1 object o activator.createin...

C 反射泛型

摘自 c 泛型反射和普通反射的區別,泛型反射和普通反射的區別就是泛型引數的處理上 先看乙個簡單的例子。class class1 要利用反射動態建立該型別例項,並呼叫 test 方法,我們可以使用如下方法 type type typeof class1 object o activator.creat...

C 反射泛型

摘自 c 泛型反射和普通反射的區別,泛型反射和普通反射的區別就是泛型引數的處理上 先看乙個簡單的例子。class class1 要利用反射動態建立該型別例項,並呼叫 test 方法,我們可以使用如下方法 type type typeof class1 object o activator.creat...