以前在開發一個系統的時候
小組裡的人在寫方法的時候很累,很多方法都是對象的屬性需要大量的重複賦值,然後 添加到List對象中
你是否還在為一個對象裡有幾十 上百個屬性 手動寫代碼賦值煩惱呢?
下面是一個以前的讀取資料庫 資訊的例子
[c-sharp] view plaincopyprint?
- public IList<KFS_Model.QAS_V_MessageInfo> PagerTest(string where, KFS_Model.Pager p)
- {
- SqlDataReader dr = null;
- string table = "QAS_V_MessageInfo";
- string orderby = "QuestionTime";
- IList<KFS_Model.QAS_V_MessageInfo> list = new List<KFS_Model.QAS_V_MessageInfo>();
- Pagination.page(table, where, orderby, true,p);
- dr = Pagination.page(table, where, orderby, false, p);
- while (dr.Read())
- {
- KFS_Model.QAS_V_MessageInfo qas = new KFS_Model.QAS_V_MessageInfo();
- qas.UserId = dr.GetGuid(1);
- qas.UserName = dr.GetString(2);
- qas.SonModelId = dr.GetGuid(3);
- qas.SonModelName = dr.GetString(4);
- qas.QuestionId = dr.GetGuid(5);
- qas.QuestionTitle = dr.GetString(6);
- qas.QuestionUrl = dr.GetString(7);
- qas.QuestionTime = dr.GetDateTime(8);
- qas.QuestionSession = dr.GetInt32(9);
- qas.QuestionContent = dr.GetString(10);
- qas.FatherModelId = dr.GetGuid(11);
- list.Add(qas);
- }
- return list;
- }
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?
- public class Class1<T>
- {
- public IList<T> GetData(SqlDataReader reader)
- {
- IList<T> list = new List<T>();
- Type type = typeof(T);
- PropertyInfo[] properties = type.GetProperties();
-
- while (reader.Read())
- {
- T t = Activator.CreateInstance<T>();
- for (int i = 0; i < properties.Length; i++)
- {
- properties[i].SetValue(t, reader[i + 1], null);
-
- }
-
- list.Add(t);
- }
-
- return list;
- }
- }
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?
- public static IEnumerable<T> GetObjects<T>(this DbDataReader rd) where T : new()
- {
- var fs = (from fd in typeof(T).GetFields()
- let desc = new { field = fd, index = rd.GetOrdinal(fd.Name) }
- where desc.index >= 0
- select desc)
- .ToList();
- foreach (var x in rd)
- {
- var obj = new T();
- fs.ForEach(d => { d.field.SetValue(obj, rd[d.index]); });
- yield return obj;
- }
- }
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)