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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型 .

發布時間:2024/9/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型 . 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

?

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

?

下面是一個以前的讀取數據庫 信息的例子

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 class ClassName<T>

{

?

}

?

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

?

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;}}

?

?

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

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

?

?

?

?下面一個擴展方法 由 論壇的sql1234提供 在一次感嘆 linq語法的簡潔

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 >= 0select desc).ToList();foreach (var x in rd){var obj = new T();fs.ForEach(d => { d.field.SetValue(obj, rd[d.index]); });yield return obj;} }

?

?

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

轉載于:https://www.cnblogs.com/gxy217/archive/2012/06/12/2546858.html

總結

以上是生活随笔為你收集整理的让你省写大量重复代码的方法 使用PropertyInfo类 反射获取类 的类型 .的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。