最近在做公司的項目,自己負責webapi的框架的搭建與開發,最近很忙,一直沒時間對工作中遇到的知識點缺少個總結,現總結一下,對自己是個提升,如果個人的小點點小總結能對博友有幫助那也是善莫大焉.
(1)、 首先說一下c# dynamic,dynamic是FrameWork4.0的新特性.我在api中用了比較多的dynamic,首先個人認為dynamic能使代碼變得優雅,可以省去定義多余的實體,dynamic是運行時決定類型有哪些屬性,包括賦值和取值都可以隨便指定屬性,
例如:
dynamic sourceInfo = SqlDataHelper.GetWebDMDynamicData(sourceIdSql, new {id=3).FirstOrDefault(); if (null != sourceInfo) { item.SourceId = sourceInfo.SourceId; item.DocType = sourceInfo.DocType; item.InvestmentType = sourceInfo.InvestmentType; }
以上代碼中sourceInfo指定了dynamic,開發人員知道如果取值成功肯定會有SourceId屬性,所以item.SourceId = sourceInfo.SourceId;賦值就不奇怪了.
同樣如下代碼也可以自己為dynamic隨便指定屬性:
1 dynamic data= null; 2 data= SqlDataHelper.GetWebDMDynamicData(sql, new { Id = id }).ToList().FirstOrDefault(); 3 data.a= 124; 4 data.b= "test2"; 5 data.c="test3";
可以為dynamic類型data隨便指定屬性,前提條件是在第(2)步驟時data的值不能為空,否則在第(3)步data是null,這時候就會出現空異常.
(2)、再談論一下輕量級的ORM框架,這個框架網上已經充斥了大量的學習資料,本人只是對項目中的使用心得做些概括,不對之處歡迎指正.
我們知道調用數據庫存儲過程肯定有參數化,dapper提供了一個比較好的參數化對象DynamicParameters,上代碼:
DynamicParameters dynamicParameters = new DynamicParameters(); dynamicParameters.Add("@p_Id1", id1, DbType.String); dynamicParameters.Add("@p_Id2", id2, DbType.Int32); dynamicParameters.Add("@p_dateTime", dateTime, DbType.DateTime); List<dynamic> info = conn.Query<T>(storeProcedureName,dynamicParameters, null, true, null, CommandType.StoredProcedure) as List<T>;
如果要指定執行存儲過程,那麼要指定CommandType.StoredProcedure關鍵字.
(3)、以下是List<T>轉dataTable的方法,的確為類型轉換省去了好多的代碼,但是也有一個自己花了點時間沒有解決的問題,就是T必須指定實體類型,而不能使用dynamic,否則type.GetProperties
取不到正確的屬性,這樣系統就必須多定義一個實體類傳進來.
public static DataTable ToDataTable<T>(IList<T> list) { //create propertyInfo List<PropertyInfo> pList = new List<PropertyInfo>(); //get reflector interface Type type = typeof(T); DataTable dt = new DataTable(); //add datatable column Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, Nullable.GetUnderlyingType( p.PropertyType) ?? p.PropertyType); }); foreach (var item in list) { //create new row DataRow row = dt.NewRow(); pList.ForEach(p => row[p.Name] = p.GetValue(item, null)??System.DBNull.Value); dt.Rows.Add(row); } return dt; }
好了,以上就是項目中的一些小小的總結,還有一些零碎的知識點不做過多描述了.通過項目過程中還有好多要學習的能力,特別是溝通能力,技術引導業務能力.