利用反射實現DataTable 與 List 轉換


今天上班不太忙,就想着總結一下反射、擴展方法、以及lambda表達式的用法,自己就寫了個小DEMO記錄一下,希望各位大牛們看到后覺得不對的地方請及時提出。這篇文章中我只說明我的用法,作為一個備忘,基本的語法我不講解,對這些概念不熟悉的童鞋在博客園上搜素一下,呢那個找到很多相關的講解,小弟就先拋磚引玉了。

另附鏈接一枚,如果你想知道c#1.0--c#4.0 主要基礎知識匯總,請猛點下面鏈接,你還可以看到該片文章中提到的知識點。

猛點我

概述反射

  •  通過反射可以提供類型信息,從而使得我們開發人員在運行時能夠利用這些信息構造和使用對象。 
  •  反射機制允許程序在執行過程中動態地添加各種功能。

詳細見我的163博客.NET反射詳解

擴展方法

引MSDN對擴展方法的定義: 擴展方法使你能夠向現有類型“添加”方法(包括你自定義的類型和對象噢),而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。擴展方法是一種特殊的靜態方法,但是可以像擴展類型上的實例方法一樣進行調用。對於用C#編寫的客戶端代碼,調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差異。

lambda表達式

引百度百科對Lambda的定義“Lambda 表達式”是一個匿名函數,它可以包含表達式和語句,並且可用於創建委托或表達式目錄樹類型。 所有 Lambda 表達式都使用 Lambda 運算符 =>,該運算符讀為“goes to”。該 Lambda 運算符的左邊是輸入參數(如果有),右邊包含表達式或語句塊。

說了這么多,開始上代碼。

方法一:擴展方法與反射實現 DataTable 轉 List<T>

public static  List<T> ToList<T>(this DataTable dt) where T:class,new()
       {
           Type t=typeof(T);
           PropertyInfo[] propertys = t.GetProperties();
           List<T> lst = new List<T>();
           string typeName = string.Empty;

           foreach (DataRow dr in dt.Rows)
           {
               T entity = new T();
               foreach (PropertyInfo pi in propertys)
               {
                   typeName = pi.Name;
                   if (dt.Columns.Contains(typeName))
                   {
                       if (!pi.CanWrite) continue;
                       object value = dr[typeName];
                       if (value == DBNull.Value) continue;
                       if (pi.PropertyType == typeof(string))
                       {
                           pi.SetValue(entity,value.ToString(),null);
                       }
                       else if (pi.PropertyType == typeof(int) || pi.PropertyType == typeof(int?))
                       {
                           pi.SetValue(entity,int.Parse(value.ToString()), null);
                       }
                       else if (pi.PropertyType == typeof(DateTime?) || pi.PropertyType == typeof(DateTime))
                       {
                           pi.SetValue(entity, DateTime.Parse(value.ToString()), null);
                       }
                       else if (pi.PropertyType == typeof(float))
                       {
                           pi.SetValue(entity, float.Parse(value.ToString()), null);
                       }
                       else if (pi.PropertyType == typeof(double))
                       {
                           pi.SetValue(entity, double.Parse(value.ToString()), null);
                       }
                       else
                       {
                           pi.SetValue(entity,value, null);
                       }
                   }
               }
               lst.Add(entity);
           }
           return lst;
       }

方法一調用

(1)首先創建一個實體類

 public class People
    {
        public string Name { get; set; }
        public int Age{get;set;}
    }

(2)調用

DataTable dt = new DataTable();
        dt.Columns.Add("Name");
        dt.Columns.Add("Age");
        DataRow dr = dt.NewRow();
        dr[0] = "eric";
        dr[1] = 20;
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr[0] = "eric1";
        dr[1] = 22;
        dt.Rows.Add(dr);

        List<People> p = dt.ToList<People>();

方法二:擴展方法與Action委托實現數組的遍歷操作(ForEach)

public static void ForEach<T>(this IEnumerable<T> ien,Action<T> express)
       {
           foreach (var item in ien)
           {
               express(item);
           }
           
       }

方法二調用

 List<string> lst = new List<string>();
        var arr = new string[3] { "eric01", "eric02", "eric03" };
        arr.ForEach(it => lst.Add(it));//這里面可以做更復雜的處理
        Response.Write(lst[0]);

 

方法三:利用方法一和方法二實現List<t>轉換DataTable

public static DataTable ToDataTable<T>(this IEnumerable<T> value) where T : class,new()
       {
           List<PropertyInfo> lstProperty = new List<PropertyInfo>();
           Type type=typeof(T);
           DataTable dt = new DataTable();
           type.GetProperties().ForEach(p =>  //ForEach擴展方法,這里使用Array.ForEach(type.GetProperties(),p=>{})也是一樣
           {
               lstProperty.Add(p);
               if (p.PropertyType.IsGenericType)//是否為泛型,泛型獲取不到具體的類型
               {
                   dt.Columns.Add(p.Name);
               }
               else
               {
                   dt.Columns.Add(p.Name,p.PropertyType);
               }
           });
           if (value != null)
           {
               foreach (var item in value)
               {
                   //創建一個DataRow實例
                   DataRow row = dt.NewRow();
                   lstProperty.ForEach(p =>
                   {
                       row[p.Name] = p.GetValue(item, null);
                   });
                   dt.Rows.Add(row);
               }
           }
           return dt;
       }

OK了 今天就到此為止了,睡覺嘍。每天學習一點點,每天進步一點點。


免責聲明!

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



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