CN.Text開發筆記—利用反射將資料讀入實體類

來源:互聯網
上載者:User

在實際開發中,我們經常需要從資料庫中讀取資料並賦值給實體類的相應屬性。在.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));

        

        }


對於上面的代碼,我覺得有幾點不優雅之處:

1、每次對Role的屬性進行賦值時,都要檢查reader的值是否為DBNull,出現了很多重複代碼

2、每次對Role的屬性進行賦值時,都要進行類型轉換, 而Role屬性的類型是已知的,是不是可以自動完成這樣的轉換?

3、每次對Role的屬性進行賦值時,都要進行Role屬性與資料庫欄位的對應。如果我們在設計資料庫與實體類時,保證資料庫欄位與實體類屬性採用同樣的名稱,那利用反射,我們可以通過代碼自動進行屬性與欄位的對應。即使資料庫欄位與屬性不同名,我們也可以通過更改查詢語句,來做到這一點。

是不是可以對上面的代碼進行改進,使代碼變得更優雅?那優雅的代碼應該是什麼樣的呢?如果我們用上面代碼中注釋的程式碼ReaderToObject(reader,role);取代它之前的對Role屬性進行賦值的語句,是不是會使代碼變得更優雅?ReaderToObject的作用就是自動完成將reader中的值寫入到role中對應的屬性中(前提是reader中的欄位與role中對應的屬性具有相同的名稱)。現在我們的任務就是實現ReaderToObject, 有了強大的武器—Reflection,我們的任務就變得很輕鬆, 也不多說了,下面的代碼是我的實現方法:

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中的資料讀入到任何實體類中。資料庫欄位與實體類屬性的映射原則是名稱相同。當然,我們也可以通過設定檔來進行兩者映射。

    個人想法:在開發中,面對那麼多設計思想和設計模式,常常令人感到迷惑,當你把更多的精力放在選用哪個設計思想或設計模式時,我覺得不要忽略很重要的一點,儘可能地減少重複代碼,只要我們能有效地減少重複代碼,我們採用的方法就是好方法,而不要太在乎採用了哪種模式。就像獨孤九劍,正因為擺脫了傳統招式的束縛,才能戰無不勝!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.