程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 利用.NET反射機制實現IList到DataTable轉換

利用.NET反射機制實現IList到DataTable轉換

編輯:.NET實例教程

本文的意義並不僅僅是為了說明如何將IList轉換為DataTable,而是給出一個利用反射來實現對各種數據結構(集合類)相互轉換的通用方法的編寫思路。

相信很多使用過Nhibernate的朋友都知道,通過NH訪問數據庫,數據都是以ILIST形式返回的,這就為我們在.Net中使用傳統的數據綁定造成了不便。由於NH返回的ILIST所裝載的對象往往都是不同的,我們會為每個返回的LIST單獨編寫轉換方法,而利用反射機制卻可以做成通用的轉換方法。 

代碼如下(C#):



using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Collections;
using System.Reflection;

namespace KycBaseModule
...{
    public class KycFunction
    ...{
        public KycFunction() ...{ }
        /**//// <summary>
        /// 實現對IList到DataSet的轉換
        /// </summary>
        /// <param name="ResList">待轉換的IList</param>
        /// <returns>轉換後的DataSet</returns>
        public static DataSet ListToDataSet(IList ResList)

    ...{
            DataSet RDS=new DataSet();
            DataTable TempDT = new DataTable();

            //此處遍歷IList的結構並建立同樣的DataTable
            System.Reflection.PropertyInfo[] p = ResList[0].GetType().GetPropertIEs();
            foreach (System.Reflection.PropertyInfo pi in p)
            ...{
                TempDT.Columns.Add(pi.Name,System.Type.GetType(pi.PropertyType.ToString()));
            }

            for (int i = 0; i < ResList.Count; i++)
            ...{
                IList TempList = new ArrayList();
                //將IList中的一條記錄寫入ArrayList
                foreach (System.Reflection.PropertyInfo pi in p)
           &nbsp;    ...{
                    object oo = pi.GetValue(ResList[i], null);
                    TempList.Add(oo);
                }
                
                object[] itm=new object[p.Length];
                //遍歷ArrayList向object[]裡放數據
                for (int j = 0; j < TempList.Count; j++)
                ...{
                    itm.SetValue(TempList[j], j);
                }
                //將object[]的內容放入DataTable
                    TempDT.LoadDataRow(itm, true);
            }
            //將DateTable放入DataSet
            RDS.Tables.Add(TempDT);
            //返回DataSet
            return RDS;
        }
    }
}

由上面的代碼可以看出,實現的過程非常簡單。首先利用反射,將傳入方法的IList中的對象所包含的屬性進行獲取,然後根據獲取的屬性建立DataTable的Columns,然後利用循環遍歷整個IList,將每個結點對象所包含的內容依次復制到DataTable。由於該代碼取自真實的項目模塊,所以保留了原有的命名空間和將DataTable放入Dataset的幾行。

希望本文能夠為需要進行數據轉換的朋友提供些靈感。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved