讓你省寫大量重複代碼的方法 使用PropertyInfo類 反射擷取類 的類型 .

來源:互聯網
上載者:User

以前在開發一個系統的時候

小組裡的人在寫方法的時候很累,很多方法都是對象的屬性需要大量的重複賦值,然後 添加到List對象中

 

你是否還在為一個對象裡有幾十 上百個屬性 手動寫代碼賦值煩惱呢?

 

下面是一個以前的讀取資料庫 資訊的例子

[c-sharp] view plaincopyprint?
  1. public IList<KFS_Model.QAS_V_MessageInfo> PagerTest(string where, KFS_Model.Pager p)  
  2.         {  
  3.             SqlDataReader dr = null;  
  4.             string table = "QAS_V_MessageInfo";  
  5.             string orderby = "QuestionTime";  
  6.             IList<KFS_Model.QAS_V_MessageInfo> list = new List<KFS_Model.QAS_V_MessageInfo>();  
  7.             Pagination.page(table, where, orderby, true,p);  
  8.             dr = Pagination.page(table, where, orderby, false, p);  
  9.             while (dr.Read())  
  10.             {  
  11.                 KFS_Model.QAS_V_MessageInfo qas = new KFS_Model.QAS_V_MessageInfo();  
  12.                 qas.UserId = dr.GetGuid(1);  
  13.                 qas.UserName = dr.GetString(2);  
  14.                 qas.SonModelId = dr.GetGuid(3);  
  15.                 qas.SonModelName = dr.GetString(4);  
  16.                 qas.QuestionId = dr.GetGuid(5);  
  17.                 qas.QuestionTitle = dr.GetString(6);  
  18.                 qas.QuestionUrl = dr.GetString(7);  
  19.                 qas.QuestionTime = dr.GetDateTime(8);  
  20.                 qas.QuestionSession = dr.GetInt32(9);   
  21.                 qas.QuestionContent = dr.GetString(10);  
  22.                 qas.FatherModelId = dr.GetGuid(11);  
  23.                 list.Add(qas);  
  24.             }  
  25.             return list;              
  26.         }  

public IList<KFS_Model.QAS_V_MessageInfo> PagerTest(string where, KFS_Model.Pager p)<br /> {<br /> SqlDataReader dr = null;<br /> string table = "QAS_V_MessageInfo";<br /> string orderby = "QuestionTime";<br /> IList<KFS_Model.QAS_V_MessageInfo> list = new List<KFS_Model.QAS_V_MessageInfo>();<br /> Pagination.page(table, where, orderby, true,p);<br /> dr = Pagination.page(table, where, orderby, false, p);<br /> while (dr.Read())<br /> {<br /> KFS_Model.QAS_V_MessageInfo qas = new KFS_Model.QAS_V_MessageInfo();<br /> qas.UserId = dr.GetGuid(1);<br /> qas.UserName = dr.GetString(2);<br /> qas.SonModelId = dr.GetGuid(3);<br /> qas.SonModelName = dr.GetString(4);<br /> qas.QuestionId = dr.GetGuid(5);<br /> qas.QuestionTitle = dr.GetString(6);<br /> qas.QuestionUrl = dr.GetString(7);<br /> qas.QuestionTime = dr.GetDateTime(8);<br /> qas.QuestionSession = dr.GetInt32(9);<br /> qas.QuestionContent = dr.GetString(10);<br /> qas.FatherModelId = dr.GetGuid(11);<br /> list.Add(qas);<br /> }<br /> return list;<br /> }<br />

 

 

指派陳述式佔了方法的一半

而且寫起來還要一個一個的對照

 

很鬱悶的說

 

下面就是我今天公布的源碼  無任何著作權  歡迎轉載

 

首先構造一個泛型類

 

 

public class ClassName<T>

{

 

}

 

然後定義一個方法 方法返回集合

 

 

[c-sharp] view plaincopyprint?
  1. public class Class1<T>  
  2. {  
  3.     public IList<T> GetData(SqlDataReader reader)  
  4.     {  
  5.         IList<T> list = new List<T>();  
  6.         Type type = typeof(T);  
  7.         PropertyInfo[] properties = type.GetProperties();  
  8.   
  9.         while (reader.Read())  
  10.         {  
  11.             T t = Activator.CreateInstance<T>();  
  12.             for (int i = 0; i < properties.Length; i++)  
  13.             {  
  14.                 properties[i].SetValue(t, reader[i + 1], null);  
  15.   
  16.             }  
  17.   
  18.             list.Add(t);  
  19.         }  
  20.   
  21.         return list;  
  22.     }  
  23. }  

public class Class1<T><br /> {<br /> public IList<T> GetData(SqlDataReader reader)<br /> {<br /> IList<T> list = new List<T>();<br /> Type type = typeof(T);<br /> PropertyInfo[] properties = type.GetProperties();</p><p> while (reader.Read())<br /> {<br /> T t = Activator.CreateInstance<T>();<br /> for (int i = 0; i < properties.Length; i++)<br /> {<br /> properties[i].SetValue(t, reader[i + 1], null);</p><p> }</p><p> list.Add(t);<br /> }</p><p> return list;<br /> }<br /> } 

 

上面給出了核心代碼 如果你要傳遞sql語句

那你的商務邏輯層 就要這一個方法也就夠了!

 

 

 

 下面一個擴充方法 由 論壇的sql1234提供 在一次感歎 linq文法的簡潔

 

[c-sharp] view plaincopyprint?
  1. public static IEnumerable<T> GetObjects<T>(this DbDataReader rd) where T : new()  
  2. {  
  3.     var fs = (from fd in typeof(T).GetFields()  
  4.                 let desc = new { field = fd, index = rd.GetOrdinal(fd.Name) }  
  5.                 where desc.index >= 0  
  6.                 select desc)  
  7.             .ToList();  
  8.     foreach (var x in rd)  
  9.     {  
  10.         var obj = new T();  
  11.         fs.ForEach(d => { d.field.SetValue(obj, rd[d.index]); });  
  12.         yield return obj;  
  13.     }  
  14. }  

public static IEnumerable<T> GetObjects<T>(this DbDataReader rd) where T : new()<br />{<br /> var fs = (from fd in typeof(T).GetFields()<br /> let desc = new { field = fd, index = rd.GetOrdinal(fd.Name) }<br /> where desc.index >= 0<br /> select desc)<br /> .ToList();<br /> foreach (var x in rd)<br /> {<br /> var obj = new T();<br /> fs.ForEach(d => { d.field.SetValue(obj, rd[d.index]); });<br /> yield return obj;<br /> }<br />}</p><p>

 

 

這裡,我們通過擴充方法,為任意DbDataReader都增加了一個GetObjects方法,返回任意指定類型的強型別的對象集合。如果包括private的field才更完整。應該將 GetFields() 修改為
GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.