擴展方法 DataTable To List


生活很精彩,所以我自己創造自己的喜歡的東西,或取之有方。
有時code累,重復的東西也多...也不是很美觀,怎么樣讓自己更爽趕快順手的編碼呢....
所以擴展方法也來了..

一、擴展方法描述一方:

擴展方法使您能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。 對於用 C# 和 Visual Basic 編寫的客戶端代碼,調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差異。
擴展方法被定義為靜態方法,但它們是通過實例方法語法進行調用的。 它們的第一個參數指定該方法作用於哪個類型,並且該參數以 this 修飾符為前綴。 僅當您使用 using 指令將命名空間顯式導入到源代碼中之后,擴展方法才位於范圍中。

可以使用擴展方法來擴展類或接口,但不能重寫擴展方法。 與接口或類方法具有相同名稱和簽名的擴展方法永遠不會被調用。 編譯時,擴展方法的優先級總是比類型本身中定義的實例方法低。 換句話說,如果某個類型具有一個名為Process(int i) 的方法,而您有一個具有相同簽名的擴展方法,則編譯器總是綁定到該實例方法。 當編譯器遇到方法調用時,它首先在該類型的實例方法中尋找匹配的方法。 如果未找到任何匹配方法,編譯器將搜索為該類型定義的任何擴展方法,並且綁定到它找到的第一個擴展方法。 下面的示例演示編譯器如何確定要綁定到哪個擴展方法或實例方法。

二、實例Demo 之 DataTable=>List<T>

1.不說大家只說我自己,平時在項目中都會從數據庫中獲取數據DataTable,然后轉換成對應的實體對象列表。【這里實體的字段名和DataTable列名是對應的】

實體類:

   public class SendMsgModel
    {
        public int Id { getset; }
        public String DestNumber { getset; }
        public String Content { getset; }
        public String SmsId { getset; }
        public String UserName { getset; }
        public String Password { getset; }
    }

 

擴展前代碼: 

  public class ToObject
    {
 
        /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static List<T> List<T>(DataTable dt)
        {
            var list = new List<T>();
            Type t = typeof (T);
            var plist = new List<PropertyInfo>(typeof (T).GetProperties());
 
            foreach (DataRow item in dt.Rows)
            {
                T s = System.Activator.CreateInstance<T>();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
                    if (info != null)
                    {
                        if (!Convert.IsDBNull(item[i]))
                        {
                            info.SetValue(s, item[i], null);
                        }
                    }
                }
                list.Add(s);
            }
            return list;
        }
    }

 

調用:

        DataTable dt= odbc.ExecuteDataTable(@"select top(100) Id , DestNumber  , Content  , SmsId  , UserName  , Password   from Send";
        var list=ToObject.List<SendMsgModel>(dt);

擴展后代碼:

   /// <summary>
    /// 擴展類
    /// </summary>
public static class Extension    
{
      /// <summary>
        /// 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static List<T> List<T>(this DataTable dt)
        {
            var list = new List<T>();
            Type t = typeof(T);
            var plist = new List<PropertyInfo>(typeof(T).GetProperties());
 
            foreach (DataRow item in dt.Rows)
            {
                T s = System.Activator.CreateInstance<T>();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
                    if (info != null)
                    {
                        if (!Convert.IsDBNull(item[i]))
                        {
                            info.SetValue(s, item[i], null);
                        }
                    }
                }
                list.Add(s);
            }
            return list;
        } 
 
    }

     
調用:

  DataTable dt= odbc.ExecuteDataTable(@"select top(100) Id , DestNumber  , Content  , SmsId  , UserName  , Password   from Send";
  var list2=   dt.List<SendMsgModel>();

三、比較

  1. 前 var list=ToObject.List<SendMsgModel>(dt);

  2.  var list2=   dt.List<SendMsgModel>();

  使用風格上是不是就很大區別了?自己感受哈。Linq 的感覺?

  之后繼續慢慢積累,對於性能方面還沒有研究,應該也不賴吧.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM