泛型 反射 動態實現增刪改查

2021-10-24 19:03:02 字數 3901 閱讀 3154

以add()為例項——反射的實現

getmodel()

//1通過assembly動態載入乙個程式集

assembly assembly = assembly.

load

("kanghui.common");

//2通過type獲取t型別

type type =

typeof

(t);

//3過型別可以建立乙個物件

t obj=

(t)activator.

createinstance

(type)

;//4通過型別獲取所有公共屬性集合

propertyinfo[

] prolists = type.

getproperties()

;//5通過型別獲取方法的集合

methodinfo[

] methods = type.

getmethods()

;type type =

typeof

(t);

propertyinfo[

] pro = type.

getproperties()

;string id = pro[0]

.name;

//如果t是類名,則pro[0].name的意思是:獲取該類第乙個屬性名稱,即id.

生成meta原始檔,讓你的dll檔案的體積變大;

反射會影響程式的效能;

不安全 比如:乙個泛型方法需要乙個class 但是傳入的是乙個int ,而我們並沒有進行泛型約束,那麼此時這個程式就報錯了。

原始靜態**:

/// 

/// 增加一條資料

///

public

intadd

(threedemo.model.usersmodel model)

; parameters[0]

.value = model.username;

parameters[1]

.value = model.pwd;

parameters[2]

.value = model.districtid;

parameters[3]

.value = model.qq;

parameters[4]

.value = model.phone;

parameters[5]

.value = model.***;

parameters[6]

.value = model.loginnumber;

parameters[7]

.value = model.lastlogintime;

parameters[8]

.value = model.manage;

object obj = dbhelpersql.

getsingle

(strsql.

tostring()

,"", parameters);if

(obj ==

null

)else

}

改為動態載入:

/// 

/// 增加一條資料

///

public

intadd

<

t>

(t t)

str1.

remove

(str1.length -1,

1); str2.

remove

(str2.length -1,

1);stringbuilder strsql =

newstringbuilder()

; strsql.

("insert into "

+type.name.

replace

("model",""

)+"(")

; strsql.

(str1+

")")

; strsql.

(" values (");

strsql.

(str2+

")")

; list par =

newlist

<

sqlparameter

>()

;for

(int i =

1; i < propertyinfo.length; i++

) sqlparameter[

] sqlparameters = par.

toarray()

;int rows = dbhelpersql.

executesql

(strsql.

tostring()

, connstring, sqlparameters);if

(rows >0)

else

}

/// 

/// 得到乙個物件實體

///

public t getmodel

<

t>

(int userid)

str1.

remove

(str1.length -1,

1);stringbuilder strsql =

newstringbuilder()

;if(str1 !=

null

) strsql.

(" where "

+id+

"=@"

+id+"")

; sqlparameter[

] parameters =

; parameters[0]

.value = userid;

dataset ds = dbhelpersql.

query

(strsql.

tostring()

, connstring, parameters);if

(ds.tables[0]

.rows.count >0)

else

}

//原始形態

private

loginmodel

datarowtomodel

(datarow dr)if(

!dr.

isnull

("loginname"))

if(!dr.

isnull

("pwd"))

if(!dr.

isnull

("status"))

return model;

}//改寫為動態轉換形式

private t datarowtomodel

<

t>

(datarow dr)

}return model;

}

typeof() 和 gettype()區別

typeof(x)中的x,必須是具體的類名、型別名稱等,不可以是變數名稱。

gettype()方法繼承自object,所以c#中任何物件都具有gettype()方法,它的作用和typeof()相同,返回type型別的當前物件的型別。

比如有這樣乙個變數 i:

int32 i = new int32();

i.gettype()返回值是int32的型別,但是無法使用typeof(i),因為i是乙個變數,如果要使用typeof(),則只能:typeof(int32),返回的同樣是int32的型別。

模擬泛型DAO增刪改查 jdbc實現

在我之前做的的jdbc專案,引數列表中傳入的都是指定型別,一旦新增了實體類,又要重新寫乙個dao層的方法,但是功能基本都是一致的,導致 大量冗餘,可維護性極差,所以在這裡引入泛型dao來解決這個問題,規定泛型,傳入的引數可以是任意實體類,而我們在控制層可以將方法返回的泛型型別的值強轉為我們要使用的實...

運用泛型實現增刪改

最近在做專案時,頻繁的使用增刪改,把大量時間花費在寫sql語句和引數上,就想能不能寫乙個通用的方法省略掉寫sql 和引數。想了一段時間,想到.net裡面有attitude類,可以自定義屬性,這樣就可以根據自定義屬性獲取sql欄位和引數名,然後構造出sql語句和sqlparamertes 要想根據不同...

陣列使用泛型來完成增刪改查操作

public class array public array public int getcapacity public int getsize public boolean isempty size是陣列的第乙個空元素的定位符。向所有元素後新增乙個新元素 public void addlast ...