日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CN.Text开发笔记—利用反射将数据读入实体类

發(fā)布時(shí)間:2025/7/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CN.Text开发笔记—利用反射将数据读入实体类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在實(shí)際開發(fā)中,我們經(jīng)常需要從數(shù)據(jù)庫中讀取數(shù)據(jù)并賦值給實(shí)體類的相應(yīng)屬性。在.Text的DataDTOProvider中存在大量這樣的代碼, 比如:

public?Role[]?GetRoles(int?BlogID)
????????
{
????????????System.Collections.ArrayList?al
=new?System.Collections.ArrayList();
????????????IDataReader?reader
=DbProvider.Instance().GetRoles(BlogID);
????????????
try
????????????
{
????????????????
while(reader.Read())
????????????????
{
????????????????????Role?role
=new?Role();
????????????????????
if(reader["RoleID"]!=DBNull.Value)
????????????????????
{
????????????????????????role.RoleID
=(int)reader["RoleID"];
????????????????????}

????????????????????
if(reader["Name"]!=DBNull.Value)
????????????????????
{
????????????????????????role.Name
=(string)reader["Name"];
????????????????????}

????????????????????
if(reader["Description"]!=DBNull.Value)
????????????????????
{
????????????????????????role.Description
=(string)reader["Description"];
????????????????????}

????????????????????
//ReaderToObject(reader,role);
????????????????????al.Add(role);
????????????????}

????????????}

????????????
finally
????????????
{
????????????????reader.Close();
????????????}

????????????
return?(Role[])al.ToArray(typeof(Role));
????????
????????}


對于上面的代碼,我覺得有幾點(diǎn)不優(yōu)雅之處:
1、每次對Role的屬性進(jìn)行賦值時(shí),都要檢查reader的值是否為DBNull,出現(xiàn)了很多重復(fù)代碼
2、每次對Role的屬性進(jìn)行賦值時(shí),都要進(jìn)行類型轉(zhuǎn)換, 而Role屬性的類型是已知的,是不是可以自動(dòng)完成這樣的轉(zhuǎn)換?
3、每次對Role的屬性進(jìn)行賦值時(shí),都要進(jìn)行Role屬性與數(shù)據(jù)庫字段的對應(yīng)。如果我們在設(shè)計(jì)數(shù)據(jù)庫與實(shí)體類時(shí),保證數(shù)據(jù)庫字段與實(shí)體類屬性采用同樣的名稱,那利用反射,我們可以通過代碼自動(dòng)進(jìn)行屬性與字段的對應(yīng)。即使數(shù)據(jù)庫字段與屬性不同名,我們也可以通過更改查詢語句,來做到這一點(diǎn)。
是不是可以對上面的代碼進(jìn)行改進(jìn),使代碼變得更優(yōu)雅?那優(yōu)雅的代碼應(yīng)該是什么樣的呢?如果我們用上面代碼中注釋的代碼行ReaderToObject(reader,role);取代它之前的對Role屬性進(jìn)行賦值的語句,是不是會(huì)使代碼變得更優(yōu)雅?ReaderToObject的作用就是自動(dòng)完成將reader中的值寫入到role中對應(yīng)的屬性中(前提是reader中的字段與role中對應(yīng)的屬性具有相同的名稱)?,F(xiàn)在我們的任務(wù)就是實(shí)現(xiàn)ReaderToObject, 有了強(qiáng)大的武器—Reflection,我們的任務(wù)就變得很輕松, 也不多說了,下面的代碼是我的實(shí)現(xiàn)方法:

private?void?ReaderToObject(IDataReader?reader,object?targetObj)
????????
{
????????????
for(int?i=0;i<reader.FieldCount;i++)
????????????
{
????????????????System.Reflection.PropertyInfo?propertyInfo
=targetObj.GetType().GetProperty(reader.GetName(i));
????????????????
if(propertyInfo!=null)
????????????????
{
????????????????????
if(reader.GetValue(i)!=DBNull.Value)
????????????????????
{
????????????????????????propertyInfo.SetValue(targetObj,reader.GetValue(i),
null);
????????????????????}

????????????????}

????????????}

????????}

ReaderToObject可以將reader中的數(shù)據(jù)讀入到任何實(shí)體類中。數(shù)據(jù)庫字段與實(shí)體類屬性的映射原則是名稱相同。當(dāng)然,我們也可以通過配置文件來進(jìn)行兩者映射。

????個(gè)人想法:在開發(fā)中,面對那么多設(shè)計(jì)思想和設(shè)計(jì)模式,常常令人感到迷惑,當(dāng)你把更多的精力放在選用哪個(gè)設(shè)計(jì)思想或設(shè)計(jì)模式時(shí),我覺得不要忽略很重要的一點(diǎn),盡可能地減少重復(fù)代碼,只要我們能有效地減少重復(fù)代碼,我們采用的方法就是好方法,而不要太在乎采用了哪種模式。就像獨(dú)孤九劍,正因?yàn)閿[脫了傳統(tǒng)招式的束縛,才能戰(zhàn)無不勝!

總結(jié)

以上是生活随笔為你收集整理的CN.Text开发笔记—利用反射将数据读入实体类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。