第5章第2節(jié)-通用類和接口的設(shè)計(jì)_第1頁(yè)
第5章第2節(jié)-通用類和接口的設(shè)計(jì)_第2頁(yè)
第5章第2節(jié)-通用類和接口的設(shè)計(jì)_第3頁(yè)
第5章第2節(jié)-通用類和接口的設(shè)計(jì)_第4頁(yè)
第5章第2節(jié)-通用類和接口的設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩43頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第5章第2節(jié)通用類和接口的設(shè)計(jì)董久敏本節(jié)學(xué)習(xí)要點(diǎn)1.訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)(請(qǐng)參見(jiàn)DataAccessLayer\DB類)2.將DataReader對(duì)象轉(zhuǎn)換成為實(shí)體類對(duì)象(對(duì)象集合)幫助類(請(qǐng)參見(jiàn)DataAccessLayer\DataReaderHelper類)3.通用接口的設(shè)計(jì)(請(qǐng)參見(jiàn)InterFace\IEntity接口)任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類DB的設(shè)計(jì)實(shí)現(xiàn)訪問(wèn)數(shù)據(jù)庫(kù)通用類DB的設(shè)計(jì)任務(wù)目標(biāo)

1ADO.NET控件

2.NET中的事務(wù)管理知識(shí)要點(diǎn)任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

(說(shuō)明:以下代碼請(qǐng)參見(jiàn)DataAccessLayer\DB.cs文件)一、在.NET中實(shí)現(xiàn)事務(wù)處理的函數(shù)///<summary>///在.NET中實(shí)現(xiàn)事務(wù)處理///</summary>///<paramname=“sqlarray”>類型IList<string>,作為單個(gè)工作單元來(lái)執(zhí)///行的SQL命令集合</param>///<paramname="parameters">類型IList<SqlParameter[],SQL命令集///合對(duì)應(yīng)的命令參數(shù)集合,其中的每條SQL命令對(duì)應(yīng)一個(gè)參數(shù)數(shù)組:///SqlParameter[]</param>///<returns>事務(wù)執(zhí)行成功:返回大于true,失?。篺asle</returns>publicboolexecuteTransaction(IList<string>sqlarray,IList<SqlParameter[]>parameters){

任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字open();SqlTransactionts=con.BeginTransaction();SqlCommandcmd=con.CreateCommand();cmd.Transaction=ts;try{

for(inti=0;i<sqlarray.Count;i++){cmd.CommandText=sqlarray[i];cmd.Parameters.Clear();

任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字if(parameters[i]!=null){cmd.Parameters.AddRange(parameters[i]);}cmd.ExecuteNonQuery();cmd.Parameters.Clear();}ts.Commit();returntrue;}任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字catch(Exceptione){ts.Rollback();returnfalse;}finally{ts.Dispose();cmd.Dispose();close();}}任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字(一)事務(wù)執(zhí)行的步驟:1.調(diào)用SqlConnection對(duì)象的BeginTransaction方法,以標(biāo)記事務(wù)的開(kāi)始。BeginTransaction方法返回對(duì)事務(wù)的引用。此引用分配給在事務(wù)中登記的SqlCommand對(duì)象。2.將Transaction對(duì)象分配給要執(zhí)行的SqlCommand的Transaction屬性。如果在具有活動(dòng)事務(wù)的連接上執(zhí)行命令,并且尚未將Transaction對(duì)象配給Command對(duì)象的Transaction屬性,則會(huì)引發(fā)異常。3.執(zhí)行所需的命令。4.調(diào)用SqlTransaction對(duì)象的Commit方法完成事務(wù),或調(diào)用Rollback方法結(jié)束事務(wù)。如果在Commit或Rollback方法執(zhí)行之前連接關(guān)閉或斷開(kāi),事務(wù)將回滾。主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

(二)代碼說(shuō)明:

1.如果要將多項(xiàng)任務(wù)綁定在一起,使其作為單個(gè)工作單元來(lái)執(zhí)行,可以使用ADO.NET中的事務(wù)。2.事務(wù)的作用域限于該連接。以上示例執(zhí)行顯式事務(wù),該事務(wù)由try塊中執(zhí)行的SQL命令組組成。如果沒(méi)有引發(fā)異常,則提交。如果引發(fā)異常,catch塊中的代碼將回滾事務(wù)。如果在事務(wù)完成之前事務(wù)中止或連接關(guān)閉,事務(wù)將自動(dòng)回滾。

3.函數(shù)中的參數(shù):

(1)IList<string>sqlarray:作為單個(gè)工作單元來(lái)執(zhí)行的SQL命令集合。(2)IList<SqlParameter[]>parameters:SQL命令集合對(duì)應(yīng)的命令參數(shù)集合,其中的每條SQL命令對(duì)應(yīng)一個(gè)參數(shù)數(shù)組:SqlParameter[]。任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

二、執(zhí)行事務(wù)方法:同時(shí)添加、修改、刪除主表--明細(xì)表(子表)中的記錄。(適用于主表—子表同時(shí)操作)///<summary>///執(zhí)行事務(wù)方法:同時(shí)添加、修改、刪除主表--明細(xì)表(子表)中的記錄。///說(shuō)明:本函數(shù)首先對(duì)主表進(jìn)行執(zhí)行添加、修改、刪除,然后對(duì)子表操、、///作,因此要?jiǎng)h除主表記錄,則要求主表--子表之間不存在主外鍵約束關(guān)///系。///</summary>///<paramname="sqls">要執(zhí)行的SQL語(yǔ)句:類型:IList<string>,///sqls[0]:對(duì)主表執(zhí)行的命令,///sqls[1]:對(duì)明細(xì)表執(zhí)行的插入記錄命令,無(wú)插入則為null,///sqls[2]:對(duì)明細(xì)表執(zhí)行的修改記錄命令,無(wú)修改則為null,///sqls[3]:對(duì)明細(xì)表執(zhí)行的刪除記錄命令,無(wú)刪除則為null,///</param>任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字///<paramname=“master_parameters”>對(duì)主表執(zhí)行命令需要的參數(shù)集///合,無(wú)參數(shù)則為null,類型:IList<SqlParameter[]></param>///<paramname=“insert_parameters”>對(duì)明細(xì)表執(zhí)行的插入記錄命令需///要的參數(shù)集合,無(wú)參數(shù)則為null,類型:///IList<SqlParameter[]></param>///<paramname=“update_parameters”>對(duì)明細(xì)表執(zhí)行的修改記錄命令需///要的參數(shù)集合,無(wú)參數(shù)則為null,類型:///IList<SqlParameter[]></param>///<paramname=“del_parameters”>對(duì)明細(xì)表執(zhí)行的刪除記錄命令需要///的參數(shù)集合,無(wú)參數(shù)則為null,類型:IList<SqlParameter></param>///<returns>執(zhí)行成功:true,失?。篺alse,類型:bool</returns>任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字publicboolexecuteTransaction_few(IList<string>sqls,IList<SqlParameter[]>master_parameters,IList<SqlParameter[]>insert_parameters,IList<SqlParameter[]>update_parameters,IList<SqlParameter>del_parameters){open();SqlTransactionts=con.BeginTransaction();SqlCommandcmd=con.CreateCommand();cmd.Transaction=ts;cmd.CommandType=CommandType.StoredProcedure;//執(zhí)行存儲(chǔ)過(guò)程

//cmd.CommandType=CommandType.Text;//執(zhí)行SQL命令任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字try{//1添加、修改、(刪除)主表記錄

cmd.Parameters.Clear();cmd.CommandText=sqls[0];if(master_parameters!=null){cmd.Parameters.AddRange(master_parameters[0]);cmd.ExecuteNonQuery();}else{returnfalse;}任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字//2添加明細(xì)表記錄

if(sqls[1]!=null){cmd.CommandText=sqls[1];if(insert_parameters!=null){//添加一條、多條子表記錄

for(inti=0;i<insert_parameters.Count;i++){cmd.Parameters.Clear();cmd.Parameters.AddRange(insert_parameters[i]);cmd.ExecuteNonQuery();}}}任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字//3修改明細(xì)表記錄

if(sqls[2]!=null){cmd.CommandText=sqls[2];if(update_parameters!=null){//修改一條、多條子表記錄

for(inti=0;i<update_parameters.Count;i++){cmd.Parameters.Clear();cmd.Parameters.AddRange(update_parameters[i]);cmd.ExecuteNonQuery();}}}任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字//4刪除明細(xì)記錄

if(sqls[3]!=null){cmd.CommandText=sqls[3];if(del_parameters!=null){//刪除一條、多條子表記錄

for(inti=0;i<del_parameters.Count;i++){cmd.Parameters.Clear();cmd.Parameters.Add(del_parameters[i]);cmd.ExecuteNonQuery();}}}任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字//以上多條命令執(zhí)行成功,則提交事務(wù)

ts.Commit();returntrue;}catch(Exceptione){//以上多條命令執(zhí)行有失敗的,則回滾事務(wù)

ts.Rollback();returnfalse;}finally{ts.Dispose();cmd.Dispose();close();}}任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字說(shuō)明:

1.本函數(shù),先對(duì)主表進(jìn)行操作,再對(duì)子表進(jìn)行操作,因此如果對(duì)子表進(jìn)行刪除操作,則需要主表---子表之間不存在主外鍵約束關(guān)系。

2.對(duì)主表—子表同時(shí)進(jìn)行操作,必然對(duì)主表進(jìn)行操作,因此如果對(duì)主表操作的命令參數(shù)集合master_parameters==null,意味著對(duì)主表沒(méi)有操作,則返回false。

3.對(duì)子表添加記錄,可以添加多條記錄,添加記錄的命令是一樣的,改變的只是命令參數(shù),因此用以下循環(huán)語(yǔ)句依次添加不同的命令參數(shù),然后依次執(zhí)行添加記錄的命令:for(inti=0;i<insert_parameters.Count;i++){cmd.Parameters.Clear();cmd.Parameters.AddRange(insert_parameters[i]);cmd.ExecuteNonQuery();}任務(wù)1

—訪問(wèn)數(shù)據(jù)庫(kù)通用類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字4.對(duì)子表中記錄的修改、刪除操作,請(qǐng)參考3.中的說(shuō)明。5.對(duì)以上所有操作都成功后,提交事務(wù),否則,回滾事務(wù)。提示:1.IList<string>sqls,sqls[0]、sqls[1]、sqls[2]、sqls[3]分別保存對(duì)主表操作的命令、對(duì)子表的添加記錄、修改記錄、刪除記錄的命令。如果不需要對(duì)應(yīng)的操作命令,則將對(duì)應(yīng)項(xiàng)賦為null。

2.如果主表—子表之間有主外鍵約束關(guān)系,要實(shí)現(xiàn)對(duì)主表的刪除操作,請(qǐng)參見(jiàn)DB類中的函數(shù):publicboolexecuteTransaction_few_del(IList<string>sqls,IList<SqlParameter[]>master_parameters,IList<SqlParameter[]>insert_parameters,IList<SqlParameter[]>update_parameters,IList<SqlParameter>del_parameters){……}任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)

1,實(shí)現(xiàn)將DataReader對(duì)象轉(zhuǎn)換成為實(shí)體類對(duì)象(對(duì)象集合)的類

DataReaderHelper的設(shè)計(jì)任務(wù)目標(biāo)

1泛型和反射機(jī)制

2.IList<T>接口、可空類Nullable類知識(shí)要點(diǎn)任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字(說(shuō)明:以下代碼請(qǐng)參見(jiàn)DataAccessLayer\DataReaderHelper.cs文件)一、將DataReader對(duì)象轉(zhuǎn)換成為對(duì)應(yīng)的實(shí)體類對(duì)象(對(duì)象集合)的類的設(shè)計(jì)///<summary>///小龍2014-08-08///DataReader轉(zhuǎn)換成為實(shí)體類幫助類///</summary>publicstaticclassDataReaderHelper{///<summary>///將DataReader對(duì)象轉(zhuǎn)換成為實(shí)體類對(duì)象

///</summary>///<typeparamname="T">實(shí)體類型</typeparam>

任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字///<paramname="dr">IDataReader接口</param>///<returns>實(shí)體類T的對(duì)象</returns>publicstaticTReaderToEntity<T>(IDataReaderdr){

using(dr){if(dr.Read()){TypemodelType=typeof(T);//獲取對(duì)象的類型

intcount=dr.FieldCount;//獲取datareader的列總數(shù)

Tmodel=Activator.CreateInstance<T>();//反射創(chuàng)建對(duì)象

for(inti=0;i<count;i++){

任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字if(!IsNullOrDBNull(dr[i]))//不為空才設(shè)定值

{//獲取reader[i]所對(duì)應(yīng)對(duì)象的屬性

PropertyInfopi=modelType.GetProperty(GetPropertyName(dr.GetName(i)),BindingFlags.GetProperty|BindingFlags.Public|BindingFlags.Instance|BindingFlags.IgnoreCase);if(pi!=null){//設(shè)定屬性對(duì)應(yīng)的值

pi.SetValue(model,HackType(dr[i],pi.PropertyType),null);}任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字}}returnmodel;}}returndefault(T);}///<summary>///轉(zhuǎn)換成為實(shí)體類集合

///</summary>///<typeparamname="T">實(shí)體類型</typeparam>///<paramname="dr">IDataReader接口</param>///<returns>實(shí)體類T的對(duì)象集合</returns>任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字publicstaticIList<T>ReaderToList<T>(IDataReaderdr){using(dr){List<T>list=newList<T>();//定義實(shí)體類的對(duì)象集合

TypemodelType=typeof(T);intcount=dr.FieldCount;while(dr.Read()){//使用與指定參數(shù)匹配程度最高的構(gòu)造函數(shù)創(chuàng)建指定類型的實(shí)例

Tmodel=Activator.CreateInstance<T>();for(inti=0;i<count;i++){if(!IsNullOrDBNull(dr[i]))任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字PropertyInfopi=modelType.GetProperty(GetPropertyName(dr.GetName(i)),BindingFlags.GetProperty|BindingFlags.Public|BindingFlags.Instance|BindingFlags.IgnoreCase);if(pi!=null){pi.SetValue(model,HackType(dr[i],pi.PropertyType),null);}}}list.Add(model);}returnlist;}}任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字///<summary>///類型轉(zhuǎn)換,把數(shù)據(jù)庫(kù)的類型轉(zhuǎn)換成為C#中的類型

///這個(gè)類對(duì)可空類型進(jìn)行判斷轉(zhuǎn)換,要不然會(huì)報(bào)錯(cuò)

///</summary>///<paramname="value">要轉(zhuǎn)換的對(duì)象</param>///<paramname="conversionType">對(duì)象中的類型</param>///<returns>返回指定類型的對(duì)象</returns>privatestaticobjectHackType(objectvalue,TypeconversionType){if(conversionType.IsGenericType&&conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))

任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字{if(value==null)returnnull;System.ComponentModel.NullableConverternullableConverter=newSystem.ComponentModel.NullableConverter(conversionType);conversionType=nullableConverter.UnderlyingType;}returnConvert.ChangeType(value,conversionType);}//判斷對(duì)象是否為空

privatestaticboolIsNullOrDBNull(objectobj){return(obj==null||(objisDBNull))?true:false;}任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

//取得數(shù)據(jù)表的列對(duì)應(yīng)類(對(duì)象)的屬性名

privatestaticstringGetPropertyName(stringcolumn){column=column.ToLower();//轉(zhuǎn)為小寫字母

string[]narr=column.Split('_');//返回以“_”為分隔符分離的數(shù)組,如字段名為studnet_namecolumn="";//以下循環(huán)將字符竄數(shù)組narr中的元素,連接成為單詞首字母大寫的屬性名稱。

for(inti=0;i<narr.Length;i++){任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字if(narr[i].Length>1){//單詞首字母大寫

column+=narr[i].Substring(0,1).ToUpper()+narr[i].Substring(1);}else{column+=narr[i].Substring(0,1).ToUpper();}}returncolumn;}}任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字(一)主要函數(shù)說(shuō)明:

1.DataReaderHelper類,分別通過(guò)兩個(gè)函數(shù)實(shí)現(xiàn)了將DataReader對(duì)象轉(zhuǎn)換為實(shí)體類對(duì)象、實(shí)體類對(duì)象集合。

2.函數(shù):publicstaticTReaderToEntity<T>(IDataReaderdr){……}功能:將DataReader對(duì)象轉(zhuǎn)換為實(shí)體類對(duì)象。

3.函數(shù):

publicstaticIList<T>ReaderToList<T>(IDataReaderdr){……}功能:將DataReader對(duì)象轉(zhuǎn)換為實(shí)體類對(duì)象集合。4.privatestaticboolIsNullOrDBNull(objectobj){……}功能:判斷對(duì)象是否為空

任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

5.privatestaticstringGetPropertyName(stringcolumn){……}

功能:將數(shù)據(jù)表的字段名轉(zhuǎn)換為對(duì)應(yīng)類(對(duì)象)的屬性名,例如:如果數(shù)據(jù)表的字段名為student_name,轉(zhuǎn)換后對(duì)應(yīng)類的屬性名為StudentName

6.privatestaticobjectHackType(objectvalue,TypeconversionType){……}

功能:把數(shù)據(jù)庫(kù)的類型轉(zhuǎn)換成為C#中的類型,這個(gè)類對(duì)可空類型進(jìn)行判斷轉(zhuǎn)換,要不然會(huì)報(bào)錯(cuò)。(二)主要語(yǔ)句說(shuō)明:

1.TypemodelType=typeof(T):用于獲取類型的

Type

對(duì)象。2.Tmodel=Activator.CreateInstance<T>():使用與指定參數(shù)匹配程度最高的構(gòu)造函數(shù)創(chuàng)建指定類型的實(shí)例。

任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

3.TypemodelType=typeof(T):用于獲取類型的

System.Type

對(duì)象;Tmodel=Activator.CreateInstance<T>(),使用與指定參數(shù)匹配程度最高的構(gòu)造函數(shù)創(chuàng)建指定類型的實(shí)例。4.PropertyInfopi=modelType.GetProperty(GetPropertyName(dr.GetName(i)),BindingFlags.GetProperty|BindingFlags.Public|BindingFlags.Instance|BindingFlags.IgnoreCase);(1)GetProperty(String,BindingFlags),使用指定的綁定約束搜索指定屬性。其中:①BindingFlags.GetProperty:指定應(yīng)返回指定屬性的值。

②BindingFlags.Public:指定公共成員將包括在搜索中。

③BindingFlags.Instance:指定實(shí)例成員將包括在搜索中。④BindingFlags.IgnoreCase:指定當(dāng)綁定時(shí)不應(yīng)考慮成員名的大小寫。任務(wù)2

—將DataReader轉(zhuǎn)換為實(shí)體類對(duì)象的類的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

5.PropertyInfo.SetValue(Objectobj,Objectvalue,Object[]index)功能:設(shè)置該屬性的值,其中:

obj類型:System.Object將設(shè)置其屬性值的對(duì)象。value類型:System.Object此屬性的新值。index類型:System.Object[]索引化屬性的可選索引值。對(duì)于非索引化屬性,此值應(yīng)為null。

6.Type.IsGenericType屬性屬性值:如果當(dāng)前類型是泛型類型,則為true;否則為false。主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

5.PropertyInfo.SetValue(Objectobj,Objectvalue,Object[]index)功能:設(shè)置該屬性的值,其中:

obj類型:System.Object將設(shè)置其屬性值的對(duì)象。value類型:System.Object此屬性的新值。index類型:System.Object[]索引化屬性的可選索引值。對(duì)于非索引化屬性,此值應(yīng)為null。任務(wù)3

—通用接口的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

(以下代碼請(qǐng)參見(jiàn)InterFace\Ientity.cs文件)一、實(shí)體接口IEntity的設(shè)計(jì)查詢的結(jié)果對(duì)應(yīng)的類型總是不確定的,本項(xiàng)目中解決的方法有兩種:第一種方法是通過(guò)使用泛型,例如上述DataReaderHelper類中的方法,將查詢結(jié)果轉(zhuǎn)換為實(shí)體類的對(duì)象(集合);第二種方法是設(shè)計(jì)了一個(gè)通用接口,得到類的實(shí)例后,需要為該實(shí)例對(duì)象設(shè)置屬性值。但不同實(shí)體類包含的屬性各不相同,所以需要調(diào)用不同的set語(yǔ)法為屬性賦值。那么現(xiàn)在又遇到了另外一個(gè)問(wèn)題:如何統(tǒng)一set方法呢?我們換一個(gè)角度來(lái)思考,現(xiàn)在的目的是要在一個(gè)通用的方法中為實(shí)體對(duì)象的屬性賦值,而這個(gè)對(duì)象的所屬類型并不明確,但我們能夠確定的是:無(wú)論是什么樣的實(shí)體,它都應(yīng)該具有為自己的某個(gè)屬性賦值的能力。因此我們需要?jiǎng)?chuàng)建一種通用的實(shí)體類型,這種類型具有確定的行為特征(為某個(gè)屬性賦值),但不提供行為的具體實(shí)現(xiàn)方式(如何賦值并不關(guān)心)?,F(xiàn)在明白了,我們需要?jiǎng)?chuàng)建的這種特殊類型實(shí)際上就是“接口”。代碼實(shí)現(xiàn)如下:

任務(wù)3

—通用接口的設(shè)計(jì)任務(wù)3

—通用接口的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字namespaceSuperMarket.InterFace{publicinterfaceIEntity{voidsetValue(intindex,Objectobj);//為屬性設(shè)置值

intgetMaxFieldNum();//獲取實(shí)體屬性的總個(gè)數(shù)

ObjectgetID();//獲取區(qū)分實(shí)體的唯一標(biāo)識(shí)

}}

任務(wù)3

—通用接口的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字該接口的設(shè)計(jì)很簡(jiǎn)單,其中setValue方法用于通過(guò)索引為某個(gè)屬性賦值。getMaxFieldNum方法用于獲得實(shí)體中屬性的總個(gè)數(shù),設(shè)置該方法的目的是為了在循環(huán)調(diào)用setValue方法為各個(gè)屬性賦值時(shí),限制循環(huán)變量的最大值。getID方法用于獲得區(qū)分實(shí)體的唯一標(biāo)識(shí),一般對(duì)應(yīng)數(shù)據(jù)表中的主鍵值,該方法的用途到后面再進(jìn)行說(shuō)明。接口的實(shí)現(xiàn)請(qǐng)參見(jiàn)二二、(實(shí)現(xiàn)IEntity接口的)客戶交易記錄實(shí)體類

(請(qǐng)參見(jiàn)Entity\CustomerBusinessRecord。cs)publicclassCustomerBusinessRecord:IEntity{privatestringcustomerID;publicstringCustomerID任務(wù)3

—通用接口的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

{get{returncustomerID;}set{customerID=value;}}privatestringcustomerSimpleName;publicstringCustomerSimpleName{get{returncustomerSimpleName;}set{customerSimpleName=value;}}privatedecimalsubTotal;

任務(wù)3

—通用接口的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

{get{returnsubTotal;}set{subTotal=value;}}//以下為實(shí)現(xiàn)接口中的方法

publicvoidsetValue(intindex,objectobj){switch(index){case0:customerID=(string)obj;break;

case1:customerSimpleName=(string)obj;break;任務(wù)3

—通用接口的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字case2:subTotal=(decimal)obj;break;}}publicintgetMaxFieldNum(){returnConstantValues.CustomerBusinessRecord_FIELD_NUM;}publicObjectgetID(){returnnull;//returnCustomerID;}}任務(wù)3

—通用接口的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字說(shuō)明:

1.ConstantValues.CustomerBusinessRecord_FIELD_NUM,供應(yīng)商交易記錄實(shí)體的字段個(gè)數(shù)。

2.在ConstantValues類中,將項(xiàng)目中通用的信息保存到對(duì)應(yīng)的常數(shù)中。其源代碼如下:(請(qǐng)參見(jiàn)Tools\ConstantValues.cs)

publicclassConstantValues{//供應(yīng)商交易記錄實(shí)體的字段個(gè)數(shù)

publicconstintSupplierBusiReport_FIELD_NUM=5;//數(shù)據(jù)表的字段個(gè)數(shù)

publicconstintCustomer_SalesMan_View_FIELD_NUM=13;//客戶交易記錄實(shí)體類的字段個(gè)數(shù)

publicconstintCustomerBusinessRecord_FIELD_NUM=3;任務(wù)3

—通用接口的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

//采購(gòu)統(tǒng)計(jì)實(shí)體的字段個(gè)數(shù)

publicconstintPurchaseGather_FIELD_NUM=3;//記錄插入成功的信息

publicconststringDATA_INSERT_SUCCESS_MESSAGE="{0}信息插入成功";//庫(kù)存不足的提示信息

publicconststringSTOCK_NOT_ENOGHT_MSG=“編號(hào):{0},名稱:{1}的商品庫(kù)存不足";}任務(wù)3

—通用接口的設(shè)計(jì)主要代碼說(shuō)明添加標(biāo)題文字添加標(biāo)題文字

3.函數(shù)publicObjectgetID(),用于獲得區(qū)分實(shí)體的唯一標(biāo)識(shí),但CustomerBusinessRecord類對(duì)應(yīng)多個(gè)數(shù)據(jù)表聯(lián)合查詢結(jié)果,不需要實(shí)體的唯一標(biāo)識(shí),因此返回值為null。如下所示:publicObjectgetID(){returnnull;//returnCustomerID;}三、獲取IEntity的實(shí)體類集合(利用反射機(jī)制)

(請(qǐng)參見(jiàn)DataAccessLayer\DB.cs)publicIList<IEntity>

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論